Указатели (Pointers)
Указатели (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.zipcontainstask.txtwith 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
| Emoji | Direction | Vector (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 read-only • copy allowed#!/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:
| # | Symbol | Description |
|---|---|---|
| 0 | C | Letter C |
| 1 | O | Letter O |
| 2 | D | Letter D |
| 3 | E | Letter E |
| 4 | B | Letter B |
| 5 | Y | Letter Y |
| 6 | { | Opening brace |
| 7 | 3 | Digit 3 (not S!) |
| 8 | M | Letter M (not H!) |
| 9 | O | Letter O |
| 10 | J | Letter J |
| 11 | 1 | Digit 1 |
| 12 | _ | Underscore |
| 13 | D | Letter D |
| 14 | R | Letter R |
| 15 | A | Letter A |
| 16 | W | Letter W |
| 17 | } | Closing brace |
| |
Key Observations
- Symbol 7 is "3", not "S": Visually similar, but it's a digit
- Symbol 8 is "M", not "H": Important to correctly interpret the angles
- Symbol 10 is "J": Characteristic hook at the bottom
- 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
- Manual tracing: Can draw on paper following the arrows
- ASCII art: Instead of images, can generate text visualization
- Interactive visualization: Use matplotlib for drawing animation
References
- Leet speak
- Unicode arrows