/Разборы задач
31 октября 2026
Райтап на задачу «Украденный флаг»
Разбор задачи «Украденный флаг»: анализируем access-лог nginx и восстанавливаем данные, украденные через слепую SQL-инъекцию.5
10

Forensics
Задача «Не доела ...»
Если рассматривать аналогии из мира насекомых, то этот файл отчасти можно сравнить с богомолом.
Попробуй понять, был ли он красавчиком, а заодно и флаг достань!
У нас есть какой-то файл mantis без расширения, для начала понять бы, что это вообще такое.
❯ file mantis
mantis: dataУтилита file ничего не показывает, значит хексы стоит посмотреть самому. Первое, что бросилось мне в глаза, — это блок IDAT, свойственный PNG.
Продолжив изучать, что находится перед ним, можно нагуглить/понять, что 08 06 00 00 это конец IHDR-блока, где 08 — значит глубину цвета, 06 — тип цвета и 00 00 00 — параметры сжатия и фильтрации.
Итого для того, чтобы открыть изображение, нам не хватает магического заголовка файла и размеров картинки. Отличная новость состоит в том, что мы можем восстановить их из CRC-суммы.
Пишем простой код на питоне, который переберёт возможные размеры:
printf '\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x03\x20\x00\x00\x02\x58' > header.binimport zlib
for w in range(1, 4000):
for h in range(1, 4000):
data = (
b"IHDR"
+ w.to_bytes(4, "big")
+ h.to_bytes(4, "big")
+ b"\x08\x06\x00\x00\x00"
)
if zlib.crc32(data) == 0xDB700668:
print(w, h)
print(hex(w), hex(h))Он выведет подходящие размеры и переведёт их в hex-формат.
Дальше дело за малым, записываем известный заголовок в один файл и заливаем в конец его исходный файл и добавляем расширение PNG, чтобы нормально открыть его.
❯ printf '\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x03\x20\x00\x00\x03\x20' > mantis_head
❯ cat mantis >> mantis_head
❯ mv mantis_head result.png\x89\x50\x4E\x47\x0D\x0A\x1A\x0A — Магические байты\x00\x00\x00\x0D — Длина IHDR-блока\x49\x48\x44\x52 — Сами буквы IHDR