WhitePages: Unicode Whitespace Steganography & Binary Demodulation

“I stop and consider the numbers... I look at the white page and I find nothing.”
picoCTF{...}💡 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!
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 .... ....Bytes: E2 80 83 → Mapped to Binary 0
Bytes: 20 → Mapped to Binary 1
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'))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:
4. The Complete Investigation Path & Mental Roadmap
Observed that whitepages.txt appeared visually empty in text editors despite having a file size of 2,770 bytes.
Inspected raw bytes and identified exactly two distinct symbols: 0xE2 0x80 0x83 (EM Space) and 0x20 (Standard Space).
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_...}.