← Back to Writeups
CUSTOMEasySteganography

BoyevoyKlichGPT (Боевой Клич GPT)

XESXOR9/2/20263 min read
#steganography#custom#easy#audio_spectrogram_stego#linux

BoyevoyKlichGPT (Боевой Клич GPT)

Platform: caplag | Category: Steganography | Type: Challenge | Difficulty: Easy | OS: Linux | Author: XESXOR | Date: 2026-02-22 | Status: Solved Techniques: audio_spectrogram_stego

Summary

BoyevoyKlichGPT — caplag

Description

"In the midst of the epic saga 'Heroes of the Codex', the generative warrior GPT, surrounded by the shadows of the pixel valleys of CodeRealm, let out a terrifying battle cry. They say this sound contains an echo of ancient power — the shadow of a necromancer, summoned from forgotten battles. Listen to the recording and reveal the hidden spell to claim the flag!"

File: batle_cry.wav — 3.8 MB, 16-bit PCM, mono, 44100 Hz, ~43 seconds

Hint Decoding

The flavour text is loaded with steganographic breadcrumbs: ‍​‌‌​​​​‌​‌‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌​​​​‌‌​​​​​‌‌​​‌‌​​‌‌​​‌​‌​‌‌​​‌​‌‍

Phrase in descriptionMeaning
"shadow of a necromancer"n3crOm4nc3r — "Necromancer" in leet-speak
"hidden spell"Text hidden in the spectrogram (high-frequency band)
"battle cry"WAV audio file — the carrier of the hidden data
"listen to the recording"Misdirection — you need to look at it, not just listen

Analysis

Step 1 — Initial recon

Standard first-pass checks on the WAV file:

bash
file batle_cry.wav
# batle_cry.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 44100 Hz
‍​‌‌​​​​‌​‌‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌​​​​‌‌​​​​​‌‌​​‌‌​​‌‌​​‌​‌​‌‌​​‌​‌‍

exiftool batle_cry.wav   # → no suspicious metadata
strings batle_cry.wav    # → no flag in raw strings
binwalk batle_cry.wav    # → no embedded files detected

Nothing suspicious in metadata or raw bytes. The flag is not stored as plaintext.

Step 2 — LSB steganography check

Checked for LSB (Least Significant Bit) steganography in the audio samples — no hidden data found.

Step 3 — Spectrogram analysis ✅

Generated a spectrogram of the audio using SoX:

bash
sox batle_cry.wav -n spectrogram -o spectrogram.png

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

Or equivalently with Python:

python
#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import spectrogram

sample_rate, data = wavfile.read("batle_cry.wav")

f, t, Sxx = spectrogram(data, fs=sample_rate, nperseg=4096, noverlap=3072)

plt.figure(figsize=(16, 6))
plt.pcolormesh(t, f / 1000, 10 * np.log10(Sxx + 1e-10), shading='gouraud', cmap='inferno')
plt.ylabel("Frequency (kHz)")
plt.xlabel("Time (s)")
plt.colorbar(label="Power (dB)")
plt.title("Spectrogram — batle_cry.wav")
plt.ylim(0, 22)
plt.tight_layout()
plt.savefig("spectrogram.png", dpi=150)
plt.show()

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

Result

The spectrogram immediately revealed the flag burned into the ~13–14 kHz frequency band, spanning the full duration of the recording. The text caplag{REDACTED} is clearly legible in the high-frequency region — completely inaudible to the human ear, but perfectly visible as a visual pattern in the frequency domain.

Key Technique

Audio Spectrogram Steganography — text or images are encoded as tonal patterns at specific frequencies and rendered into an audio file. When the audio is visualised as a spectrogram (time vs. frequency vs. amplitude), the hidden content becomes visible. ‍​‌‌​​​​‌​‌‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌​​​​‌‌​​​​​‌‌​​‌‌​​‌‌​​‌​‌​‌‌​​‌​‌‍

When to suspect this technique:

  • Challenge involves a WAV/MP3/OGG file with a "listen carefully" theme
  • Description hints at something visual hidden in sound ("shadow", "image", "spell")
  • binwalk and strings find nothing; LSB checks are clean
  • The audio sounds like noise, music, or a "battle cry" with no obvious message

Tools to use:

  • sox batle_cry.wav -n spectrogram -o out.png — fastest CLI approach
  • Sonic Visualiser (GUI) — excellent for interactive exploration
  • Audacity → Analyse → Plot Spectrum
  • Python scipy.signal.spectrogram + matplotlib ‍​‌‌​​​​‌​‌‌​​‌‌​​‌‌​​‌‌​​‌‌​​‌​​​​‌‌​​​​​‌‌​​‌‌​​‌‌​​‌​‌​‌‌​​‌​‌‍