Jack Pan

CIT CTF 2026 · Dog Barking: three bark durations, one custom encoding

· 2 min read

The attachment is a single challenge.wav. The description says:

I recorded this audio at the dogpark the other day and I think the dogs were trying to tell me something???

A listen confirms it: a stream of crisp barks at near-uniform spacing.

Reconnaissance

$ file challenge.wav
challenge.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM,
               16 bit, mono 16000 Hz

Mono 16 kHz, ~78 s. The waveform shows pulses with similar amplitude and near-uniform silence between them. Morse comes to mind, but the silence gaps are too uniform — Morse needs at least two distinct silence widths (intra-character vs inter-character). The information is almost certainly in bark duration instead.

Finding the encoding

Threshold a 20 ms moving-average envelope, segment each bark, measure durations. Histogram them:

durationcount
0.098 s109
0.112 s29
0.155 s131

Three clearly distinct durations. The natural split:

  • short (0.098 s) → bit 0
  • long (0.155 s) → bit 1
  • medium (0.112 s) → byte separator

The counts fit: 109 + 131 ≈ 240 bits, exactly 30 bytes; 29 medium barks are exactly the right number of separators between 30 bytes.

Decoding

Split the bit stream on each medium bark — runs of exactly 8 bits, one byte each. Convert to ASCII:

$ python3 solve.py
CIT{b4rking_up_th3_wr0ng_tr33}

solve.py lives in the repo. The pipeline is just envelope → threshold → duration histogram → split on separators → ASCII.

CIT{b4rking_up_th3_wr0ng_tr33}

Postmortem

  • The “three distinct durations” reading is the whole challenge. The histogram does the work. The hard step in Misc audio is usually what to measure, not how to compute.
  • Custom encodings like this are common in Misc / Steganography. Heuristic: if the raw signal discretizes into N distinct values, the payload is hiding in the arrangement of those N values.
  • If a challenge is actually Morse rather than a custom code, look for two silence widths (intra-character vs inter-character). Use that as your “is this Morse?” anchor.