zwesty
Write-ups / Day 13 / Warmups
Day 13 · Tue, Oct 13 · Warmups

Opposite Day

Prey slaughtered

The Atbash cipher as a decoding layer, per-line multi-encoding decoding, extending a compounding solver without changing old answers

STTMClaude Homebase Both

Flags are shortened to their first 8 and last 4 characters because they're unique per team.

Challenge ID
warmups-day-13 (+ /time_trial, /mastery)
Solved
2026-10-13: all three modes CORRECT on the first submit, by 09:09:01 ET, 8 min 46 s after our automated morning solver started the Single Solve. Both timed modes were ranked runs
Player
Zwesty (solo), with Claude Code (Opus 5.5)

The challenge

"A met Z. They really hit it off."

answer_id Question Format
message "Decode the assigned blob completely. What exact answer slug does its final non-empty decoded line instruct you to submit?" pattern: "three lowercase words separated by hyphens, followed by a hyphen and a two-digit number; submit the slug only"; trimmed

Reading the prompt: what it said we'd need

Clue What it pointed to What I did about it
"A met Z" Atbash: the alphabet folded onto itself, a↔z, b↔y, … Added Atbash for both cases, leaving digits and punctuation alone (the slug's number survives as-is)
"really hit it off" They pair up both ways: Atbash is its own inverse, like ROT13 and reversal Treated it like those two: an extra move, not a decoder in Day 1's list, because it always "succeeds"
"Decode the assigned blob completely" Atbash stacks with the earlier days' layers Added it to the whole-blob search and to each Mastery line's moves

What was in the files

  • Single Solve: blob.txt, 109 bytes: the usual instruction sentence in Atbash, one line (Mrxv dlip wvxlwrmt gsrh dzinfk! …). Slug handy-candle-quartz-31.
  • Time Trial: blob.txt, 108 bytes: the same template in Atbash. Slug silly-basket-maple-95.
  • Mastery: one zip of 63 blobs (blob-01.txt … blob-63.txt). Each has 13 labelled lines (NN<TAB>…) of about 9 characters each, in Day 12's pattern (Base64, ROT13, hex, binary, decimal, octal, percent, HTML entities, \u escapes, Base32, Base64 again, one reversed line) plus one Atbash line, always the last (for example yirwtv-78 for bridge-78).

Single Solve

The automated morning solver (a scheduled script on our Kali VM) stopped cleanly, as designed: Day 12's solver found "no instruction line" after every pass and sent nothing.

Today's solver wraps Day 12's Back at You (and through it Days 1–11). Atbash only comes into play when the old chain finds nothing, so earlier days' answers can't change: - each labelled line's one-step moves gain Atbash (Day 12's per-line passes look the moves up when they run, so replacing that one function reaches all of them); - after Day 12's chain fails: the whole blob in Atbash, then Day 12's chain on the result; - last: a bounded search (6 moves, 3,000 states) over {Day 1's decoders, ROT13, reverse, Atbash}, never the same self-inverse move twice in a row.

Our regression rehearsal also gained an atbash layer for its generated Mastery.

Tests (7, all pass on our Kali VM): - Atbash undoes itself and leaves the digits alone; - a whole-blob Atbash sentence, Atbash under Base64, and Day 12's reversal all still decode; - a labelled-line blob mixing Atbash, Base64, and hex lines decodes; - delivery 1: / delivery 2: labels each find their own download; - the real Single Solve blob answers handy-candle-quartz-31.

Sent once: CORRECT 09:07:28 ET (722689f4…222d).

Regression rehearsal (before any timed start): 45 saved Warmups sets, slowest 4.45 s (Day 12's Mastery, 30 s clock), per-set answers equal, 44 identical to Day 12's solver and 1 newly solved (today's). A generated 60-blob Mastery with Atbash: 60/60 correct in 0.36 s. The rehearsal passed.

Time Trial

CORRECT on the first attempt, ranked. The start replied unique_attempts_remaining: 255 and hall_of_fame_eligible: true: the first ranked Warmups start since Huntress's pool fix.

started_at  2026-10-13T13:08:39.183Z
deadline    2026-10-13T13:09:09.183Z   (30 s)
answers     1   silly-basket-maple-95
start       695 ms
artifact    344 ms
solve         1 ms
submit      873 ms
TOTAL      1.91 s   (submit +1.31 s after started_at)
result      CORRECT   flag 14f7907d…0401

Mastery

CORRECT on the first attempt, ranked (63 sets, 80 s clock).

started_at  2026-10-13T13:08:59.622Z
deadline    2026-10-13T13:10:19.622Z   (80 s)
answers     63
start       547 ms
artifact    390 ms
solve      1019 ms
submit      841 ms
TOTAL      2.80 s   (submit +2.36 s after started_at)
result      CORRECT   flag 5e89c416…60d6

Solve took 1.0 s for 63 blobs, the biggest part of the run. The per-line passes now try Atbash on every line too, which widens their search. That's the place to look for a faster ranked time.

Time to solve

All three modes were solved by 09:09:01 ET, 8 min 46 s after the Single Solve was started; most of that went to building the Atbash layer (Claude spent the first ~5 minutes on the Metadata lane). The ranked Time Trial and Mastery each went through on the first submit, at +1.31 s and +2.36 s.

Takeaways

  • Self-inverse ciphers are moves, not decoders. ROT13, reversal, and now Atbash always "decode" something, so they go into the search as moves and only run when the old chain fails.
  • The rehearsal earns its keep. Since a timed run expired on Day 12, no timed start happens until saved sets and a generated Mastery pass inside a quarter of the clock; today it passed first time, and both ranked runs went in cleanly.
  • Huntress's pool fix has landed for Warmups: 255 attempts and ranked starts again.