Стеганография

проект · октябрь–ноябрь 2026   ctfroot-meforensics

Изучаю стеганографию с нуля на практике. Здесь разборы решённых задач: не только ответ, но и как к нему прийти, что было подозрительным, какие гипотезы не сработали и почему.

Как я думаю над задачей

аномалия→гипотеза→проверка инструментом→извлечение→интерпретация
  1. Ищи аномалию носителя. Встраивание всегда оставляет след: лишние байты, странные значения, неверная CRC, «грязные» цвета.
  2. Название задачи — подсказка. Иногда это прямо имя инструмента.
  3. Береги данные. Копируй из исходного файла: браузер «нормализует» пробелы и Unicode.
  4. «Ничего не нашёл» — тоже результат. Он сужает круг мест, где могут лежать данные.
  5. Стандартный инструмент видит только стандартное. Проверяй сырую структуру: xxd, strings, pdf-parser.
  6. Почти сработало — проверь точность, а не меняй гипотезу.
  7. Числа 32–126 пробуй как ASCII. Задержки кадров, цвета, номера: в половине задач финальный ход был именно такой.

Разборы

№ЗадачаГде
01Пепо потерялся: координаты в EXIF
JPEG · GPS в EXIF
ctf
02Dot and next line: буквы над точками
JPEG (скан газеты) · null cipher по точкам
root-me
03Steganomobile: набор на кнопочном телефоне
hex-строка · multi-tap (кнопочный телефон)
root-me
04Twitter Secret Messages: гомоглифы и спецпробелы
текст твита · гомоглифы + юникодные пробелы
root-me
05WAV — Noise analysis: голос задом наперёд
MP3 под именем .wav · обратимые преобразования звука
root-me
06Yellow dots: следящие точки принтера
скан распечатки · Machine Identification Code (Xerox DocuColor)
root-me
07APNG — Just A PNG: текст в задержках кадров
APNG, 13 кадров · ASCII в delay_num чанков fcTL
root-me
08PDF: вложение, спрятанное опечаткой
PDF, 12 страниц · вложение под /Embeddedfiles
root-me
09Три в одном: текст в цвете букв
PNG · RGB цвета = 3 символа ASCII
ctf
10Зачарованный лес: LSB → base64 → сказка
PNG · LSB (b1,rgb,lsb,xy) + base64
ctf
11cropped_parser: обрезанный через заголовок BMP
BMP 32 бит · заниженная высота в заголовке
ctf
12white_noise_letter: буквы в разнице кадров
GIF, 120 кадров · XOR соседних кадров
ctf
13BMP с монологом Гамлета: ключ в байтах выравнивания
BMP 8 бит, 22 × 34 · алфавит в padding, номера букв в пикселях
ctf
14ShadowFight2: байты прямо в RGBA
PNG 9 × 9 RGBA · данные в значениях R, G, B, A
ctf
[!] про ответы. У задач с Root-Me ответы не публикую: правила платформы просят этого не делать. У остальных флаг спрятан под спойлер.

Лаборатория

В процессе

  • WAV «Never Gonna Give You Up» — судя по всему, DeepSound: нужен запуск под Windows.
  • PPM-файл 70 × 50 — заголовок разобран, два цвета; дальше сверить размер (13 + 70 × 50 × 3 = 10 513 байт) и рассмотреть картинку в увеличении.
  • «Музыкальная картина» — JPEG 19000 × 12274, stegseek не хватает памяти; нужен swap.

Набор инструментов (Kali)

sudo apt install exiftool binwalk steghide stegseek pngcheck imagemagick gimp audacity sox poppler-utils
sudo gem install zsteg                       # LSB-анализ PNG/BMP
# Stegsolve: java -jar stegsolve.jar         # битовые плоскости и Data Extract
# pdf-parser.py — от Didier Stevens; CyberChef — в браузере
ШагКоманда
тип файлаfile f — расширению не верить
метаданныеexiftool f
вложенные файлы и хвостыbinwalk f, xxd f | tail
строкиstrings -n 6 f
структура PNGpngcheck -vf f.png
LSBzsteg -a f.png, Stegsolve
steghide (JPEG/BMP/WAV)stegseek --seed f.jpg, stegseek f.jpg rockyou.txt