Esolangs and the misc pile
Brainfuck, Whitespace, Piet and the rest are recognisable on sight once you know what to look at. Plus the rest of the misc category: what it actually contains, and the triage that resolves most of it in under a minute.
"Misc" is where a CTF puts everything that does not fit, which makes it the one category you cannot prepare for by learning a technique. What you can prepare is the triage - because the majority of misc challenges are one of a dozen recognisable shapes, and recognising the shape is the whole difficulty.
Esolangs identify themselves by their alphabet
Every esoteric language that turns up in a CTF has a distinctive character set, and that is the entire identification problem. You do not need to know how any of them work to spot them.
| Looks like | Language | The tell |
|---|---|---|
+++++[->++++<]>. | Brainfuck | Only +-<>[]., and nothing else. The most common by a distance. |
| Blank lines, invisible | Whitespace | Spaces, tabs and newlines only - the file looks empty in a browser. |
| A grid of colour blocks | Piet | The program is a bitmap; the flow is the colour transitions. |
ook. ook? ook! | Ook! | Brainfuck with three tokens instead of eight. Same semantics. |
Long runs of ᓚᘏᗢ-like glyphs | One of the many Brainfuck substitutions | Count the distinct symbols: eight means Brainfuck under a costume. |
Dense punctuation, $_ heavy | JSFuck or a Perl one-liner | JSFuck uses only []()!+; if there are letters, it is Perl. |
Hello, World in Shakespeare | Shakespeare / Chef / other joke languages | Prose that is syntactically odd and semantically absurd. |
Whitespace deserves its own warning because it is invisible by construction - and so does everything else in hiding in text, which uses the same blindness: a challenge that looks like an empty file, or like a normal text file with odd trailing space, may be a whole program. Anything that renders as blank and is not zero bytes is worth a hex view.
The rest of the misc pile
Beyond esolangs, misc is a fairly predictable set - it now includes whole sub-genres with their own posts, from smart contracts to hardware and signal captures to side channels. Recognising which one you are in narrows the tooling immediately.
- Encoding chains. Base64 that decodes to hex that decodes to something else. Depth three or four is common; the identifier plus a decode search resolves most of them without a single manual step.
- QR and barcodes, often damaged on purpose - a missing finder pattern, an inverted image, or a code split into pieces across several files.
- Audio. A spectrogram with text drawn in it, DTMF tones, Morse, or SSTV. If a challenge gives you a
.wavwith no obvious content, look at it rather than listening to it. - Games and puzzles. A save file to edit, a client to patch, a scoring function to reverse. These are reversing challenges wearing a hat.
- Steganography in text. Zero-width characters, homoglyph substitution, or capitalisation carrying bits.
- Programming under a constraint. Solve five hundred instances in ten seconds; the challenge is the automation, not the maths.
The triage that resolves most of it
For anything textual, the order is fixed and takes under a minute, and it is the same order as the first-hour triage playbook narrowed to this category.
- Count distinct characters. Eight, three, or six-with-brackets is an esolang. Sixty-four-ish is an encoding. Two hundred and fifty-six is binary data mislabelled as text.
- Look at it in hex. Invisible characters, a BOM, trailing nulls and a file that is not what its extension says all become obvious immediately and are invisible otherwise.
- Run the decode search. A layered encoding falls out in one action, and a negative result is informative too.
- Check the length. A length that is a multiple of 4, 8, or 16, or exactly 32/40/64 hex characters, is telling you something specific.
When it is a joke
Some misc challenges are jokes, and the answer is to notice that. A file named flag.txt.gz.gz.gz.gz really does need unzipping fifty times, and the intended solution is a two-line loop rather than fifty clicks. A hundred-megabyte text file with one line different really is a sort | uniq -u. Recognising that a challenge is a joke is itself the skill being tested, and taking it seriously is the mistake.