August 14, 2026
Trace Labs — Challenge 45 — Writeup
Target file: voicemail_007_wav.wav Path: ~/OSINT/TraceLabs/challenge_45/ Date: 2026-08-14 Methodology: Spectrogram Analysis → Voice…
By Michele Grimaldi
1 min read
Target file: voicemail_007_wav.wav Path: ~/OSINT/TraceLabs/challenge_45/ Date: 2026-08-14 Methodology: Spectrogram Analysis → Voice Transcript → Morse Decoding
1. Spectrogram — Locating Voice vs. Tone
Reading the spectrogram:
- 0–11.5s: complex harmonic energy (formants) → spoken voice
- 11.5–12.5s: silence
- 12.5–20s: narrow, steady band at ~1 kHz, regular on/off pattern → Morse tone
2. Voice Transcript
Given how short the segment is (11.5s), I transcribed it using transcribe.org.
Transcript:
(00:00) "Hey, it's me, don't call this number again, okay?" (00:04) "A shipment for the facility gets moved Thursday night."
3. Morse Decoding — Python Script
I wrote a custom script using numpy/scipy (Hilbert transform for the envelope, thresholding to binarize on/off, run-length classification into dots/dashes/spaces).
Dependencies (via apt, no PEP 668 issues):
sudo apt install -y python3-numpy python3-scipysudo apt install -y python3-numpy python3-scipyScript: decode_morse.py (attached)
morse_tail.wav is an isolated segment extracted from the original voicemail_007.mp3, trimmed down to just the ~12.5–20s tone portion and exported as WAV for the numpy/scipy pipeline.
Logic:
hilbert()→ signal envelope- smoothing with a moving average (5ms)
- threshold at 30% of peak amplitude → binary on/off sequence
- run-length encoding of on/off sequences (in ms)
- base unit = shortest ON duration (a dot)
- classification: ON ≥3 units → dash (-), otherwise dot (.); gap ≥7 units → word space, gap ≥3 units → letter space
- translate Morse table → ASCII
Run it:
python3 decode_morse.py morse_tail.wavpython3 decode_morse.py morse_tail.wavOutput:
Raw Morse: -.. --- -.-. -.- --...
Decoded: DOCK7Raw Morse: -.. --- -.-. -.- --...
Decoded: DOCK74. Robustness Check
To rule out the result being an artifact of the arbitrarily chosen threshold (30%), I re-ran the script with a lower threshold (20%):
sed 's/threshold = envelope.max() \* 0.3/threshold = envelope.max() * 0.2/' decode_morse.py > decode_morse_v2.py
python3 decode_morse_v2.py morse_tail.wavsed 's/threshold = envelope.max() \* 0.3/threshold = envelope.max() * 0.2/' decode_morse.py > decode_morse_v2.py
python3 decode_morse_v2.py morse_tail.wavIdentical output: DOCK7 — stable result across two different thresholds, high confidence.
5. Final Result
Flag/Answer: DOCK7
Reconstructed OSINT context:
- Voicemail from an unidentified contact ("don't call this number again")
- References a "shipment" being moved to a "facility," Thursday night
- The Morse tail specifies the exact location: Dock 7