$ cat writeup.md…
$ cat writeup.md…
broncoctf2026
Task: ciphertext encrypted with a position-dependent Caesar where the shift grows per absolute character index. Solution: read the lyric clues (shift per char; underscores/braces skip transformation but still advance the counter), then decrypt with P[i]=(C[i]-base+i) mod 26 + base, confirmed by the bronco{ prefix.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
I'm slowly shifting, shifting afar / Char after char, char after char / I'm slowly shifting (shifting afar) // And it feels like I'm fighting / Underscores against the stream / Braces against the stream // (Source Material: Mr. Probz, 2013)
Ciphertext:
bqmkyj{Ldfmam_Nfd_Abxjpb_Thhdqeia_Snqn_Vzey_Bok_TdudakQkwfy_Kkhxbte_Yo_Jnfvdeueqq}
English summary: A single ciphertext string is given along with a "Waves" (Mr. Probz) parody lyric. The lyric is the crux — it encodes exactly how the shift behaves and how non-alphabetic characters interact with the position counter.
The lyric drives the whole solution:
_, {, and
} characters are not transformed, but they still "swim against the stream", i.e.
they remain part of the flow and still advance the position counter.So the shift applied to a letter equals its absolute zero-based index in the whole string (including separators), not a counter that only ticks on letters.
Known-plaintext confirmation. The flag wrapper is known to be bronco{. Comparing
ciphertext bqmkyj{ to plaintext bronco{:
| i | C | P | shift (C-P) |
|---|---|---|---|
| 0 | b | b | +0 |
| 1 | q | r | +1 (r+1=s? -> decrypt C-i) |
| 2 | m | o | +2 |
| 3 | k | n | +3 |
| 4 | y | c | +4 |
| 5 | j | o | +5 |
| 6 | { | { | unchanged, but i still advances |
...
$ grep --similar