Райтап на задачу «Не доела ...»

motgyl

Автор:

motgyl

31 октября 2026

10

31.10.2026
Не доела ...
Категория:

Forensics

Задача «Не доела ...»

Автор:

AlexB

Первая кровь:
velvetway
Сложность:
medium
Дата публикации:
06.12.2025
Решений:
68
Рейтинг:
4.7/5
Ссылка:
Решать

Описание

Если рассматривать аналогии из мира насекомых, то этот файл отчасти можно сравнить с богомолом.

Попробуй понять, был ли он красавчиком, а заодно и флаг достань!

Решение

У нас есть какой-то файл mantis без расширения, для начала понять бы, что это вообще такое.

❯ file mantis
mantis: data

Утилита file ничего не показывает, значит хексы стоит посмотреть самому. Первое, что бросилось мне в глаза, — это блок IDAT, свойственный PNG.

IDAT

IDAT

Продолжив изучать, что находится перед ним, можно нагуглить/понять, что 08 06 00 00 это конец IHDR-блока, где 08 — значит глубину цвета, 06 — тип цвета и 00 00 00 — параметры сжатия и фильтрации.

Итого для того, чтобы открыть изображение, нам не хватает магического заголовка файла и размеров картинки. Отличная новость состоит в том, что мы можем восстановить их из CRC-суммы.

Правильная CRC у нас уже есть

Правильная 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.bin
import 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
Итоговое изображение с флагом

Итоговое изображение с флагом

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Украденный флаг»

/Разборы задач

Райтап на задачу «Украденный флаг»

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

5