arnav garg
← deadface ctf

speak friend and enter

deadface ctf 2026 · 20 oct 2026

challenge description

EvErYbOdY's So CrEaTiVe... That last PCAP (Pirates Life) had some weird fingerprints in it. Dig into it and see if you can find out what DEADFACE is up to. With MaudeAI rotting some brains, we think they may have tried to find a way to get even sneakier online.

this one reuses the 500mb pcap from a pirate's life for me: part 1. almost all of it was tls, so i counted ja3 hashes (a hash of the tls client hello).

tshark -r pirateslife.pcap -Y "tls.handshake.type==1" \
  -T fields -e tls.handshake.ja3 | sort | uniq -c | sort -rn

firefox shuffles its extensions, so there were lots of one-off hashes that didn't matter. one hash appeared 8 times with a long list of old ciphers that browsers don't send. seven of those connections went to normal sites like google and wikipedia, and one went to speakfriend.dctf.io.

the user agent

the plain http traffic used a user agent i hadn't seen before, SunstalkerDFBrower/2.0 (spelled like that). the site responds with Vary: User-Agent, so i requested it with that user agent:

curl -s -A "SunstalkerDFBrower/2.0 (Linux; Android 14)" \
  https://speakfriend.dctf.io/post/tgri-innovation-summit-recap

with the normal user agent it's a food blog. with this one the posts are deadface op notes, and this post ends with a code:

pilotnoi{7p-ied-lf6h-6ti-3f0r-dr4e50qx-ob-ag-z44}

decoding it

pilotnoi is 8 letters, same as deadface, so i tried it as a vigenère cipher and worked out the key from the two:

"".join(chr((ord(c) - ord(p)) % 26 + 65) for c, p in zip("pilotnoi", "deadface"))
# MELLONME

the key is mellon, the password to the doors of moria ("speak friend and enter", same as the domain). decoding the rest with only letters gave garbage. it worked once i included the digits in the alphabet, so base 36:

abc = string.ascii_lowercase + string.digits
key = "mellon"
out = [abc[(abc.index(c) - abc.index(key[i % 6])) % 36] for i, c in enumerate(ct)]
# deadface we 411 h4v3 the s4me 1nt3rnet d0 w3 n0t

flag:

deadface{we_411_h4v3_the_s4me_1nt3rnet_d0_w3_n0t}

yes, i obviously used some ai to help draft these write-ups.