PICOCTF 2019 • FORENSICS • WHITESPACE STEGANOGRAPHY

WhitePages: Unicode Whitespace Steganography & Binary Demodulation

By AbdoAug 31, 2026
WhitePages Analysis
Official Challenge Prompt

“I stop and consider the numbers... I look at the white page and I find nothing.”

Category: Forensics / Whitespace StegoPoints: 250 PTSFlag Format: picoCTF{...}
Provided File (Download & Practice)⬇️ Download whitepages.txtSize: 2,770 Bytes • UTF-8 Text
Method: Invisible Spaces $\rightarrow$ Binary

💡 THE INTUITIVE ANALOGY (Invisible Ink with Wide & Narrow Spaces)

If someone hands you a piece of paper that looks totally blank, you might think it has no information. But if you look under a microscope, you notice the document is filled with thousands of spaces: some are normal narrow spaces (0x20), and some are extra-wide Unicode “EM Spaces” (\u2003). Because there are exactly two types of spaces, they form a secret binary code: Wide = 0, Narrow = 1!

HEX DUMP & BYTE IDENTIFICATION

1. Inspecting the 2,770 Bytes

Running Format-Hex reveals the entire 2.7 KB file consists of only two repeating UTF-8 byte sequences:

00000000   E2 80 83 E2 80 83 E2 80 83 E2 80 83 20 E2 80 83  ............ ...
00000010   20 E2 80 83 E2 80 83 20 20 20 E2 80 83 E2 80 83   ....   ....
Character 1: U+2003 (EM Space)

Bytes: E2 80 83 → Mapped to Binary 0

Character 2: 0x20 (ASCII Space)

Bytes: 20 → Mapped to Binary 1

METHOD B: AUTOMATED PYTHON PARSER & ONELINER

2. Automated Extraction Script (`solve.py`)

# Read the raw UTF-8 whitespace characters
with open('whitepages.txt', 'rb') as f:
    raw = f.read()

# Decode UTF-8 string
text = raw.decode('utf-8')

# Map EM SPACE (\u2003) -> 0 and ASCII SPACE (' ') -> 1
binary_str = text.replace('\u2003', '0').replace(' ', '1')

# Convert 8-bit binary chunks into ASCII bytes
flag_bytes = bytes([
    int(binary_str[i:i+8], 2) 
    for i in range(0, len(binary_str) - len(binary_str) % 8, 8)
])

print("🎉 Decoded Flag:")
print(flag_bytes.decode('utf-8', errors='ignore'))
⚡ Terminal One-Liner (PowerShell / Bash):
python -c "t=open('whitepages.txt','rb').read().decode('utf-8').replace('\u2003','0').replace(' ','1'); print(bytes([int(t[i:i+8],2) for i in range(0,len(t)-len(t)%8,8)]).decode('utf-8',errors='ignore'))"

3. Decoded Flag

Extracted Secret Flag:

picoCTF{not_all_spaces_are_created_equal_f6166971531e3ad3b35138611330bba8}

4. The Complete Investigation Path & Mental Roadmap

STEP 1
File Size vs Visual Discrepancy

Observed that whitepages.txt appeared visually empty in text editors despite having a file size of 2,770 bytes.

STEP 2
Hex Signature & Unicode Analysis

Inspected raw bytes and identified exactly two distinct symbols: 0xE2 0x80 0x83 (EM Space) and 0x20 (Standard Space).

STEP 3
Binary Demodulation & Flag Recovery

Mapped the two whitespace characters to binary 0 and 1, grouped into 8-bit ASCII bytes, and extracted the flag: picoCTF{not_all_spaces_are_created_equal_...}.

Cyber Amber
#f59e0b
PresetsClick to lock