← Back to Writeups
CUSTOMMediumSteganography

Радио-пират

XESXOR9/10/20262 min read
#steganography#custom#medium#sstv_decode#audio_extraction#robot36#windows

Радио-пират

Platform: duckerz | Category: Steganography | Type: Challenge | Difficulty: Medium | OS: Windows | Author: XESXOR | Date: 2026-01-22 | Status: Solved Techniques: sstv_decode, audio_extraction, robot36

Summary

Files: radio_pirate.mp4 (MP4 video, 235 seconds)

Радио-пират — duckerz CTF

Description

В начале 2000х те, у кого было продвинутое радио-оборудование, изредка пытались создать свое кустарное радио. У нашего сегодняшнего героя получилось не только выйти в эфир, но и побеседовать. Жаль что диалог не задался... Полученную строку необходимо подставить в DUCKERZ{your_string}

Files: radio_pirate.mp4 (MP4 video, 235 seconds)

Analysis

The video shows a WebSDR interface with a waterfall diagram — this is a recording of a radio broadcast. WebSDR is software-defined radio accessible via a web interface. The waterfall diagram shows the frequency spectrum of the signal over time. ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

The characteristic sound in the audio indicates SSTV (Slow Scan Television) — a method of transmitting images over radio, popular among amateur radio operators. SSTV encodes an image into an audio signal that can be transmitted over a radio channel.

Solution

Step 1: Extracting audio from video

bash
ffmpeg -i radio_pirate.mp4 -vn -acodec pcm_s16le audio.wav

Step 2: Decoding SSTV

Used the Python library sstv (colaclanth/sstv):

python
#!/usr/bin/env python3
from sstv.decode import SSTVDecoder
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

# First image
decoder = SSTVDecoder('audio.wav')
img = decoder.decode()
img.save('sstv_image_0.png')

The first image contained "HI" — a classic amateur radio greeting.

Step 3: Finding additional images

There were multiple SSTV images in the audio. Used the skip parameter to find them:

python
#!/usr/bin/env python3
from sstv.decode import SSTVDecoder

# Skip 140 seconds to find the second image
decoder = SSTVDecoder('audio.wav', skip=140)
img = decoder.decode()
img.save('sstv_image_140.png')

‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Step 4: Result

At skip=140 seconds found the "Always has been" meme with two astronauts:

  • "Wait, is it SSTV?"
  • "Always has been"
  • At the bottom the flag: REDACTED

Notes

  • SSTV uses Robot 36 mode (one of the most popular)
  • A single audio file can contain multiple images
  • The skip parameter allows skipping the beginning of the file
  • The sstv library (pip install sstv) — simple way to decode
  • Alternatives: QSSTV (GUI), MMSSTV (Windows) ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍