![]() |
Всем привет! Продолжаем разбирать задачки по стеганографии. Так как это задания из базового курса по стеганографии, они достаточно простые, но именно за счет этого хорошо подходят для понимания основ. Материал будет также будет полезен форензикам: форензика и стеганография тесно пересекаются, делят многие инструменты и более того, вторая, по сути, является часть первой. Именно поэтому я добавил тег forensics.
Итак, нам дана картинка 8.png, которая не открывается. Название задания прозрачно намекает, что изображение «обрезали» – скорее всего, искусственно уменьшили его высоту. На первый взгляд может показаться, что нижнюю часть просто отрезали, но скорее всего, данные остались и их там все еще столько же, сколько было изначально. Но предположим, что название задания мы проигнорировали и не знаем, в какую сторону копать. Начнем с базовой быстрой аналитики и воспользуемся удобными инструментами – например, pngcheck. Это утилита для анализа PNG-файлов и их chunks (грубо говоря, структурных блоков данных внутри PNG). Bash: Код:
pngcheck -vtp7Сразу становится понятно, что с изображением что-то не так – pngcheck находит ошибки. В частности, речь идет о неверной CRC-сумме (контрольная сумма, а если точнее – код для проверки целостности данных). В рамках CTF это почти всегда указывает на преднамеренное редактирование IHDR – типичный прием для сокрытия информации. Значение expected 8df7c7e7 – это оригинальная CRC, которая все еще хранится в файле. Предупреждение про версию zlib можно смело игнорировать – на решение задачи оно не влияет. Теперь стало ясно, почему картинка не открывается – большинство современных просмотрщиков отказываются открывать PNG, у которого некорректная CRC. Дальше возникает закономерный вопрос: как восстановить исходную высоту изображения? В описании автор аккуратно подсказывает, что стоит заглянуть в шестнадцатеричный дамп файла. То есть мы откроем PNG в hex-редакторе, найдем поле высоты и подправим его вручную. Я воспользовался онлайн-инструментом: https://hexed.it/ (подчеркну, что при работе с чувствительными данными необходимо использовать офлайн-редакторы!) Для решения подобных заданий нужно хотя бы базово понимать структуру PNG. Чтобы не перегружать разбор теорией, которая может быть многим не интересна, ограничимся самым необходимым. Нас интересует только chunk IHDR, который идет сразу после сигнатуры PNG (8 байт: 89 50 4E 47 0D 0A 1A 0A). https://forum.antichat.xyz/attachments/29127666/1.png В рамках этого задания достаточно знать, что высота изображения хранится в виде 4 байт в формате big-endian. В нашем случае это 00 00 03 B6. Старшие два байта нулевые, и эти четыре байта легко найти во второй строке – сразу после строки IHDR и четырех байт ширины. Теперь переводим 03 B6 из hex в десятичную систему и получаем 950 – ровно ту высоту, которую показал pngcheck. Но нас интересует исходное значение. В рамках CTF можно задать высоту с запасом и подобрать ее эмпирически, но в общем случае корректная высота важна (в общем случае корректную высоту можно вычислить, но для соревнований быстрее просто задать заведомо большое значение и посмотреть результат). Я задал высоту с запасом – 1500, что в шестнадцатеричной системе счисления будет 05 DC. Итого: было 00 00 03 B6, стало 00 00 05 DC. https://forum.antichat.xyz/attachments/29127666/2.png Сохраняем файл (Export) и пробуем открыть – изображение все еще не открывается. Проверяем снова: Bash: Код:
pngcheck redacted.pngBash: Код:
pngcsum redacted.png flag.png |
Топ райтап Спасибо Max
|
| Время: 18:49 |