Letting the robot play
A diary, one entry per day, of building a deterministic solver for a 31 day CTF and racing it against the clock. By Wizdumb.
How the robot works
The whole machine in one place: the game, the design, where the AI sits, how every claim was checked, the results, and every morning it went wrong.
The diary, day by day
-
Ten days late and eleven minutes to midnight
I joined Huntress CTF 2026 with ten days of challenges already out, played Day 1 the slow way, finished dead last on every board, and decided the robot was going to do this instead.
-
Seven days in one
Sunday: 167 commits, Days 1 through 7 played end to end, a scarce Mastery burned on six bugs in a row, and the first board firsts.
-
Trust, but verify the robot
Monday: Day 8 before breakfast, a full day spent making the robot prove itself, a 67 MB Swift binary hiding its secret in plain text, a 400 of 400 Mastery, and Day 9 started before midnight.
-
No such thing as an unreachable Mastery
Tuesday: five event days in one, a day the robot played start to finish without me touching it, binary answers sent before the file arrived, and first place on 8 of 10 boards in one night.
-
Thirty-fifth
Wednesday: the robot's first live 09:00 release, ten minutes and forty-four seconds to the last flag, 35th overall against a leader who finished in under a minute, and a new goal by lunch: 9:01.
-
The first race
Thursday: the new release race runs live for the first time. Mobile finishes all three modes in 8.7 seconds, binary takes eight and a half minutes, we climb from 35th to 16th, and I figure out that every day from here is a race.
-
We lose time in the transitions
Friday: all 15 checks in 219.5 seconds, down from ten minutes two days before, 8th for the day, and a lesson from the leader about the gaps between the clocks.
-
First place, at the time
Saturday: four lanes done in 33 seconds, one binary question no file could answer, about 250 wrong guesses before the grader said yes, first place on the day anyway, and five new board firsts that night.
-
Burn it down and build it lean
Sunday: our best race yet, 92.3 seconds and 4th for Day 18, two tenths off the podium, a leader at 45.5, and the call to throw the robot away and rebuild it from scratch 23 hours before the first web day.
-
We were our own denial of service
Monday: a flawless night of rehearsals, then the robot went looking for a web challenge that was never going to exist and buried itself in its own traffic. Day 19 in 293 seconds, 19th of 102, and a night of fixes.
-
Mish Mash
Tuesday: the five file lanes, all 15 checks, in 44.8 seconds, 1st on the board and a day after our own 293. Then one web challenge about reading a single file held us for four and a half minutes. 7th of 108.
-
First
Wednesday: two days after finishing 19th, Day 21 in 213.4 seconds, 1st on the day, 12 first bloods, and 1st overall out of 1,457 teams, by 5.3 seconds.
-
Back to Back
Thursday: Day 22 in 89.8 seconds, 1st on the day by 26.9 seconds and still 1st overall out of 1,476. Four file lanes done in under 13 seconds, two new web techniques in about a minute, and one binary challenge that asked old questions in new words.
-
Twenty-Nine Minutes
Friday: 22 of 24 checks done inside two minutes, eight first bloods, and then one script challenge with about 10,500 questions held us until 09:30:51. We went from 1st overall to 20th in a morning, and that afternoon the same challenge put us 1st on its Mastery board.
-
Eighty-One Seconds
Saturday: one day after finishing 20th, all 21 checks by 09:01:21, fastest of anyone, ten first bloods and back to 1st overall. Then the afternoon went to the speed boards, and we took 10 of the day's 14.
-
Everything We've Been Shown
Sunday: all 24 checks by 100.3 seconds, 1st on the day and still 1st overall. It should have been faster: a right answer sent the wrong way, and three web challenges we had already solved. So a new rule: nothing the organizers have shown us is allowed to need a hand again.
-
Immediate Attention
Monday: all 21 checks in 69.0 seconds, our fastest day of the event and the next team home at 153.8. Nothing went wrong, so the rest of the day went to the thing that could: a challenge on Day 31 with nobody on it. Now two spare lanes start warm every morning.
-
Double Spent
Tuesday: seven challenges done inside 91 seconds, and a race condition we had solved at second 54 took the rest of the morning. 4th on the day, 4th overall, and an afternoon spent making sure it never happens again.
-
Sixty-Two Seconds Ahead
Wednesday: 2nd on the day, up to 2nd overall, and a 62-second lead on the hardest challenge that crash took back in the two modes after it. So we taught the robot's helpers to show their work.
-
Show Your Work
Thursday: all 21 checks by 72.5 seconds, 1st on the day by 81 seconds and back to 1st overall. Wednesday's lesson raced, nothing else changed, and nobody touched the keyboard.
-
Wonder Wall
Day 30: the robot ran the morning race in 100.9 seconds for 2nd. Then a single 5-point Rust crackme, built to lie to anyone who looked at it, took an hour and 48 minutes and set the standings for the last day.
-
Vary
Halloween, Day 31, the decider: all 21 checks by 255.5 seconds, 4th on the day and 4th overall of 781, four-tenths of a second off the podium. The answer was sitting in a response header the whole time.