← Back to Writeups
CUSTOMMediumMisc

Указатели (Pointers)

XESXOR9/2/20264 min read
#misc#custom#medium#arrow-emoji-path-tracing-to-dr#leet-speak-interpretation-(3=e#1=i)#visual-symbol-recognition-from

Указатели (Pointers)

Platform: hackerlab | Category: Misc | Type: Challenge | Difficulty: Medium | OS: NA | Author: XESXOR | Date: 2025-12-26 | Status: Solved Techniques: Arrow emoji path tracing to draw characters, Leet-speak interpretation (3=E, 1=I), Visual symbol recognition from traced paths

Summary

Task: Decode arrow emoji sequences from task.txt. Solution: Trace arrow directions to draw characters, revealing leet-speak flag 3moj1_draw (EMOJI_draw).

Указатели (Pointers) - hackerlab.pro

Description

Они Вам указывают, а Вы просто повторяете, всё очень просто! (They point to you, and you just repeat, it's very simple!)

Flag format: CODEBY{flag}

Files

  • signs.zip contains task.txt with arrow emoji sequences

Analysis

The file task.txt contains 18 groups of arrows separated by spaces. Each group represents one character of the flag.

Arrow Direction Mapping

EmojiDirectionVector (dx, dy)
➡️Right(1, 0)
⬅️Left(-1, 0)
⬆️Up(0, -1)
⬇️Down(0, 1)
↗️Up-right(1, -1)
↘️Down-right(1, 1)
↙️Down-left(-1, 1)
↖️Up-left(-1, -1)
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Solution Idea

By following the arrow directions, we "draw" symbols. Each group of arrows is a path that, when visualized, forms a letter or digit.

Solution

Python Script for Visualization

python
#!/usr/bin/env python3
"""Arrow emoji path tracer - draws characters from arrow sequences"""

from PIL import Image, ImageDraw
import os

# Arrow direction mapping
ARROW_DIRS = {
    '➡️': (1, 0),   '➡': (1, 0),
    '⬅️': (-1, 0),  '⬅': (-1, 0),
    '⬆️': (0, -1),  '⬆': (0, -1),
    '⬇️': (0, 1),   '⬇': (0, 1),
    '↗️': (1, -1),  '↗': (1, -1),
    '↘️': (1, 1),   '↘': (1, 1),
    '↙️': (-1, 1),  '↙': (-1, 1),
    '↖️': (-1, -1), '↖': (-1, -1),
}
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

def parse_arrows(text):
    """Parse arrow emojis from text"""
    arrows = []
    i = 0
    while i < len(text):
        for arrow, direction in ARROW_DIRS.items():
            if text[i:].startswith(arrow):
                arrows.append(direction)
                i += len(arrow)
                break
        else:
            i += 1
    return arrows

def draw_symbol(arrows, size=200, line_width=3):
    """Draw symbol by following arrow directions"""
    # Calculate path
    points = [(size // 2, size // 2)]  # Start at center
    x, y = points[0]
    step = 15  # Pixels per arrow
    
    for dx, dy in arrows:
        x += dx * step
        y += dy * step
        points.append((x, y))
    
    # Normalize to fit in image
    min_x = min(p[0] for p in points)
    min_y = min(p[1] for p in points)
    max_x = max(p[0] for p in points)
    max_y = max(p[1] for p in points)
    
    width = max_x - min_x + 40
    height = max_y - min_y + 40
    
    # Offset points
    points = [(p[0] - min_x + 20, p[1] - min_y + 20) for p in points]
    
    # Create image
    img = Image.new('RGB', (max(width, 50), max(height, 50)), 'white')
    draw = ImageDraw.Draw(img)
    
    # Draw path
    if len(points) > 1:
        draw.line(points, fill='black', width=line_width)
    
    # Mark start point
    draw.ellipse([points[0][0]-3, points[0][1]-3, 
                  points[0][0]+3, points[0][1]+3], fill='green')
    
    return img
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

def main():
    with open('task.txt', 'r', encoding='utf-8') as f:
        content = f.read().strip()
    
    # Split by spaces to get symbol groups
    groups = content.split(' ')
    groups = [g for g in groups if g.strip()]
    
    os.makedirs('symbols', exist_ok=True)
    
    for i, group in enumerate(groups):
        arrows = parse_arrows(group)
        if arrows:
            img = draw_symbol(arrows)
            img.save(f'symbols/symbol_{i:02d}.png')
            print(f"Symbol {i}: {len(arrows)} arrows")
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

if __name__ == '__main__':
    main()

Visualization Results

After generating images for each arrow group:

#SymbolDescription
0CLetter C
1OLetter O
2DLetter D
3ELetter E
4BLetter B
5YLetter Y
6{Opening brace
73Digit 3 (not S!)
8MLetter M (not H!)
9OLetter O
10JLetter J
111Digit 1
12_Underscore
13DLetter D
14RLetter R
15ALetter A
16WLetter W
17}Closing brace
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Key Observations

  1. Symbol 7 is "3", not "S": Visually similar, but it's a digit
  2. Symbol 8 is "M", not "H": Important to correctly interpret the angles
  3. Symbol 10 is "J": Characteristic hook at the bottom
  4. Symbol 11 is "1": Simple vertical line

Leet-speak Interpretation

Flag content: 3moj1_draw

This is leet-speak for the word "EMOJI":

  • 3 = E
  • m = M
  • o = O
  • j = J
  • 1 = I

"3moj1" = "EMOJI" - which perfectly matches the task where we draw letters using arrow emojis! ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

And _draw indicates that we "draw" these symbols.

Alternative Approaches

  1. Manual tracing: Can draw on paper following the arrows
  2. ASCII art: Instead of images, can generate text visualization
  3. Interactive visualization: Use matplotlib for drawing animation

References

  • Leet speak
  • Unicode arrows ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍