$ cat writeup.md…
$ cat writeup.md…
broncoctf2026
Task: a chemist's secret message given as a list of (row, column[, k]) tuples. Solution: read each tuple as a periodic-table coordinate identifying an element symbol (third value picks one letter), concatenate, and lowercase to get the flag.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
This text file is what happens when a chemist tries to send you a top secret message.
Hint: all letters in the flag should be lowercase.
We are given secret.txt, a single line of tuples plus the literal characters {, }, and _:
(4, 17), (2, 16), (2, 15), (4, 9), { , (3, 2, 1), (5, 3), _ , (2, 17), (3, 13, 1), (4, 5), (2, 16), (4, 17, 2), (2, 1, 2), (4, 4, 1), (2, 2, 2), _ , ... , (3, 16), (9, 6), (3, 15), (4, 17, 2), (2, 1, 2), (3, 16), (2, 2, 2), }
Goal: decode the message into the bronco{...} flag.
The title "Atomic Substitution Theory" and the word "chemist" point directly at the periodic table. "Substitution" means we replace each token with a letter.
Each tuple is a coordinate on the periodic table:
(row, col) → the element sitting at that period/group → take its full symbol.(row, col, k) → the k-th letter (1-indexed) of that element's symbol.{, }, _ pass through unchanged; _ acts as a word separator (space).The prefix confirms the scheme immediately:
| Token | Element | Letters |
|---|---|---|
(4,17) | Br | Br |
(2,16) | O | O |
(2,15) | N | N |
(4,9) | Co | Co |
→ BrONCo — the CTF's brand ("Bronco"). Then {, (3,2,1)=Mg→M, (5,3)=Y → {MY.
Three-element tuples slice a single letter of a two-letter symbol, e.g. (4,17,2)=Br→r,
(2,1,2)=Li→i. The detached actinide row is treated as period 9, so (9,6) is Uranium.
Reading everything out and lowercasing yields:
bronco{REDACTED...REDACTED}
...
$ grep --similar