Scenario
With the Brine Signet shattered, every house hunts whatever might make its story law. Lady Seralyne, the Velvet Spider of Suncourt, sells what she claims is the dragon's true note: not the lost thing itself, only a counterfeit cadence arranged to be believed, and a wavering house is ready to buy it as proof its claim rings true. We cut one of her sendings from the wire first. Read the pleasant words; then attend to the silences between them, and expose the forgery she is truly selling.
Enumeration
The challenge provides a Sigrok session file, capture.sr, of course the first step is to inspect the Sigrok session and determine which logical channel contains useful data. Running sigrok-cli -i capture.sr --show reveals a samplerate of 2 MHz, 8 logic channels, and one named channel, D1, which stands out as the most likely candidate for protocol decoding.
Example output:
With no guarantee that the signal is UART or which baud rate is in use, the fastest path is a small sweep across the available channels and common UART rates. This approach is consistent with Sigrok’s UART workflow, where the decoder must be attached to the correct logic probe and configured with the correct serial parameters before meaningful output appears.
The useful hit is D1 @ 9600, which begins with the bytes 54 6F 20 74 68, or To th in ASCII. That confirms the capture is carrying readable UART data on channel D1 at 9600 baud.
Protocol Recovery
At this point the visible payload can be decoded, but the challenge text warns that the real secret is not in the message body. The UART plaintext itself contains the decoding instructions: the hidden data lives in the rests between frames, a long rest means 1, a short rest means 0, and eight rests form one letter.
Recovered UART text:
This is the moment where the challenge pivots from ordinary serial decoding into timing analysis. UART is asynchronous, meaning its correctness depends on symbol timing rather than a shared clock, so using gaps between completed frames as a covert channel is a natural trick for this kind of challenge.
Analysis
A custom parser is the cleanest way to solve the rest of the challenge. A Sigrok .sr session is a container format holding metadata and logic chunks, and the metadata in this capture shows a 2 MHz samplerate with probe2=D1, which maps the named line to bit position 1 in each sample byte.
The script concatenates all logic-1-* chunks, extracts bit position 1, and reconstructs UART frames by searching for a valid start bit, sampling the 8 data bits at the midpoint of each symbol, and checking for a valid stop bit. With a samplerate of 2,000,000 and baudrate 9600, each bit lasts about 208.33 samples, so a standard 10-bit UART frame spans roughly 2083 samples.
Once valid frames are recovered, the gap between one frame and the next is measured as:
That produces 592 gaps across 593 recovered UART frames. The distribution is highly structured and immediately separates into two clusters, which is exactly what the challenge text predicts.
The ±1-sample variation is just rounding noise from sampling and frame alignment, so the two logical classes are still unambiguous. Mapping short gaps to 0 and long gaps to 1, then grouping the resulting bitstream into chunks of 8 bits, follows the embedded instructions exactly.
Exploit
The only remaining ambiguity is byte interpretation. Hidden bitstreams like this often fail on the first try because of bit ordering or alignment, so the solver should test both short/long mappings, MSB-first versus LSB-first, and all offsets from 0 to 7. In this case, the correct decoding is:
- short gap =
0 - long gap =
1 - MSB-first
- offset =
0
That combination yields the hidden sentence:
The flag can then be extracted directly from the decoded ASCII stream.
Solve Script (solver.py)
Takeaways
This challenge is a good reminder that protocol decoding is sometimes only the first layer. The visible UART message existed mainly to deliver instructions for a second covert channel encoded in inter-frame timing, and that trick works especially well in asynchronous serial protocols where spacing can be manipulated without breaking the visible payload.
A practical lesson from the solve is to treat metadata, payload, and timing as separate sources of evidence. When a challenge says to read the silence, it usually means the transport-layer rhythm matters just as much as the bytes themselves.