$ cat writeup.md…
$ cat writeup.md…
broncoctf2026
Task: intercepted transmission of space-separated emoji pairs plus an image of a face with 5 header emojis and a faint 5x5 character grid. Solution: title 'Emojibius' = Emoji + Polybius; header emojis index rows/cols of a 5x5 Polybius square whose cells are the grid characters, each pair (row,col) looks up a character.
Our intelligence agency has intercepted a strange transmission. It looks like Gen-Z developed a new language. We found a cryptic image of an elderly person on a nearby server?? Can you recover the secret message?
Hint: Sometimes you can tell what's written all over someone's face.
Two artifacts are provided:
intercepted_signals.txt — a single line of space-separated emoji pairs.artifact.png — a 2816x1536 close-up of an elderly person's face. Five header emojis (🍎 🦊 🍐 🐶 🎈) run across the forehead, and a faint 5x5 character grid is written across the face.Goal: recover the hidden message.
The title Emojibius is the key clue: Emoji + Polybius. This is a Polybius square cipher where the row/column coordinates are encoded as emojis instead of digits.
(row, col) coordinates.The 5 header emojis on the forehead define the axis order (index 0-4 for both rows and columns):
[🍎=0, 🦊=1, 🍐=2, 🐶=3, 🎈=4]
The 5x5 character grid written on the face is the Polybius square content:
b r o n c
{ e m 0 j
1 s _ g 3
} a d f h
i k l p q
Each intercepted pair (row_emoji, col_emoji) maps to grid[row][col].
Map every emoji to its header index, then look up the grid cell for each pair.
#!/usr/bin/env python3 # Header emoji order from the forehead -> index 0..4 for both axes header = ["🍎", "🦊", "🍐", "🐶", "🎈"] idx = {e: i for i, e in enumerate(header)} # 5x5 Polybius square written across the face (row-major) grid = [ list("bronc"), list("{em0j"), list("1s_g3"), list("}adfh"), list("iklpq"), ] with open("intercepted_signals.txt", encoding="utf-8") as f: tokens = f.read().split() def emojis(tok): # each token is a pair of emoji code points return [c for c in tok if c in idx] plaintext = "" for tok in tokens: r_e, c_e = emojis(tok) plaintext += grid[idx[r_e]][idx[c_e]] print(plaintext)
Decoding the 23 pairs step by step:
🍎🍎=(0,0)=b 🍎🦊=(0,1)=r 🍎🍐=(0,2)=o 🍎🐶=(0,3)=n 🍎🎈=(0,4)=c
🍎🍐=o 🦊🍎=(1,0)={ 🦊🦊=(1,1)=e 🦊🍐=(1,2)=m 🦊🐶=(1,3)=0
🦊🎈=(1,4)=j 🍐🍎=(2,0)=1 🍐🦊=(2,1)=s 🍐🍐=(2,2)=_ 🍎🦊=r
🍐🍐=_ 🍎🎈=c 🍎🦊=r 🍐🍎=1 🍎🐶=n
🍐🐶=(2,3)=g 🍐🎈=(2,4)=3 🐶🍎=(3,0)=}
Concatenated: bronco{REDACTED}.
$ cat /etc/motd
Liked this one?
Pro unlocks every writeup, every flag, and API access. $9/mo.
cat pricing.md$ grep --similar