$ cat writeup.md…
$ cat writeup.md…
broncoctf2026
Task: aha.txt holds 36 space-separated 8-char tokens using only letters A and H. Solution: recognize the two-symbol alphabet as binary, map A=0/H=1, read each 8-symbol group as a big-endian ASCII byte to recover the flag.
You see, that's not funny.
A single file aha.txt was provided containing 36 space-separated 8-character
tokens made up of only the letters A and H:
AHHAAAHA AHHHAAHA AHHAHHHH AHHAHHHA AHHAAAHH AHHAHHHH AHHHHAHH AHAHAHAH AHAAAHHA AHAHAHAH AHAAHHHA AHAAHHHA AHAHHAAH AHAAHHAA AHAAHHAH AHAAAAAH AHAAHHHH AHAAHHAA AHAAHHHH AHAAHHAA AHAHHAAA AHAAAHAA AHAAHAAH AHAAHAHA AHAAAAHA AHAAHHHH AHAAHHAA AHAHAAHA AHAAHHHH AHAAAHHA AHAAHHAA AHAAHAAA AHAAAAAH AHAAHAAA AHAAAAAH AHHHHHAH
Goal: decode the two-symbol stream into the flag.
Semantic clues drive the whole task:
aha.txt all evoke laughter (aha / haha). The two-symbol
alphabet is A and H — the building blocks of a laugh.Why 8-bit ASCII and not Bacon cipher:
Choosing the bit polarity:
A=0, H=1. The first token AHHAAAHA → 01100010 = 0x62 = b,
and the run AHHAAAHA AHHHAAHA AHHAHHHH AHHAHHHA AHHAAAHH AHHAHHHH decodes to
bronco{ — an immediate confirmation of the correct polarity.A=1, H=0) produces high-bit / non-printable bytes,
which rules it out.A→0, H→1 in each token.#!/usr/bin/env python3 # No Laughing Matter — broncoctf2026 # A=0, H=1; each 8-symbol token is one big-endian ASCII byte. with open("aha.txt") as f: tokens = f.read().split() table = str.maketrans("AH", "01") flag = "".join(chr(int(tok.translate(table), 2)) for tok in tokens) print(flag)
Output:
bronco{REDACTED}
The decoded flag content is itself a string of laughter/joke abbreviations
(UFUNNY LMAO LOL XD IJBOL ROFL HAHA), fitting the "not funny" theme.
$ cat /etc/motd
Liked this one?
Pro unlocks every writeup, every flag, and API access. $9/mo.
$ cat pricing.md$ grep --similar