/Разборы задач
7 ноября 2026
Райтап на задачу «CTF-ер, который смог»
Находим параметры сжатого потока в повреждённом ZIP и восстанавливаем JPEG из raw DEFLATE с помощью короткого Python-скрипта.11
8

Forensic
Задача «Слив флагов»
Итак, перед нами файл flags.wim. Для начала узнаем про него чуть больше:
file flags.wimOUTPUT:
flags.wim: Windows imaging (WIM) image v1.13, reparse point fixupГуглим, что это за формат и как с ним работать: Вот здесь узнаем, что это формат образов диска. Далее гуглим:
WIM Linux utilsНаходим основную утилиту для работы с данным форматом: wimlib-imagexУстанавливаем (Debian/Ubuntu):
sudo apt install wimtoolsТут или просто в man (man wimlib-imagex) читаем информацию по использованию утилиты.
Распакуем образ диска и посмотрим, что внутри:
wimlib-imagex extract flags.wim
cd flags
cat * | tail
ls -la | head -5OUTPUT:
итого 4044
drwxr-xr-x 2 fderios fderios 36864 дек 11 2025 .
drwxrwxr-x 3 fderios fderios 4096 дек 11 2025 ..
-rw-r--r-- 1 fderios fderios 45 дек 11 2025 flag_001.txt
-rw-r--r-- 1 fderios fderios 45 дек 11 2025 flag_002.txtПосмотрим, что у нас лежит в файлах:
awk 1 * | head -5OUTPUT:
ZWVlMWNjMDA0NTI2NzM3MTY5NzRlNzk2ZjdhOGZhNGM4=
ODBlYzU5ZGEyZjc3ZjI1YjFiMDE1MzVmM2Y0Mzc2ZDdp=
ZDJiZTI5ZDU0OWJkZGE0NTQyYWMzYzA2NmRiNTc5OGJm=
YTcyMzcxNzQ1YzcwZTg2MmU1N2IxZDk5M2QxZDA5ZDMw=
YTA3ZDQwNTE4NjM3MDUzMzY2NTczOGE2ODFhYjY0Y2VP=Видим, что перед нами Base64-кодированные строки, раскодируем:
awk 1 * | head -1 | base64 -dOUTPUT:
eee1cc00452673716974e796f7a8fa4c8В самом первом файле флага нет. Попробуем перебрать остальные:
for f in *; do base64 -d "$f" 2>/dev/null | grep -a "BugCTF{"; doneУвы, но вывод пустой. Вероятно, нам не просто так дали именно файл в формате WIM, а не, например, ZIP. Скорее всего, где-то скрыты ещё какие-то данные, попробуем провзаимодействовать с данными до распаковки. Найдём префикс флага в base64:
echo "BugCTF{" | base64
echo "BugCTF" | base64OUTPUT:
QnVnQ1RGewo=
QnVnQ1RGCg==Берём общую часть обоих выводов и без паддинга — QnVnQ1RG.
А теперь воспользуемся старым добрым grep’ом:
grep -aoE 'QnVnQ1RG[A-Za-z0-9+/=]+' flags.wim | base64 -dВуаля! В выводе получаем флаг!
Однако на этой точке можно было пойти и другим путём — продолжить использовать wimtools.
Нам нужно чуть больше почитать про формат WIM и тогда мы узнаем, что в нём все данные хранятся в таких единицах, как blobs. Вытащим всё в виде блобсов:
wimlib-imagex info flags.wim --blobs > blobs.txtОткроем файл и заметим, что все объекты, которые мы распаковывали, имеют размер 45 байт, есть ещё метадата с отличающимся размером, а ещё мы можем предположить, что и размер зашифрованного флага также будет различаться от 45. Попробуем найти этот blob:
grep "^Uncompressed size" blobs.txt | sort | uniq -cOUTPUT:
1 Uncompressed size = 136352 bytes
1000 Uncompressed size = 45 bytes
1 Uncompressed size = 47 bytesТак, в первой строке метаданные, потом наши 1000 псевдофлагов, а что это такое с размером в 47 байт? Проверим:
grep -A4 -B1 "47 bytes" blobs.txtOUTPUT:
Hash = 0x9fc464666c7ac34b432899c3f32af11c53f8626f
Uncompressed size = 47 bytes
Compressed size = 47 bytes
Offset in WIM = 18433 bytes
Part Number = 1
Reference Count = 1
Flags = А теперь вытянем необходимые данные по этому блобу:
dd if=flags.wim bs=1 skip=18433 count=47 status=noneOUTPUT:
QnVnQ1RGe0gxREQzTl9TVFIzNE1fRjBSX01ZX0ZMNEd9=Попробуем декодировать:
echo "QnVnQ1RGe0gxREQzTl9TVFIzNE1fRjBSX01ZX0ZMNEd9=" | base64 -dВ выводе снова получаем флаг — таска решена!