Друзья, продолжаем публиковать решения нашего CTF-марафона! В нем было пять уровней сложности, в каждом по пять заданий — всего 25 заданий. Каждую неделю выкладывать по 5 решений — сегодня рассказываем о втором уровне сложности.
Результаты марафона мы подвели в начале апреля, но задания все еще доступны — и вы можете попробовать решить их для себя.
CTF-2023 от «Доктор Веб»: задания уровня Rare
1. Supreme victory
Для решения этого задание необходимо понимать принципы работы формата PDF: структура таких файла завязана на определенных объектах, и чтение файла всегда начинается с первого объекта:
Когда найден первый объект, сразу становится видным подозрительное действие “OpenAction” для объекта с порядковым номером 15.
После нужно найти этот объект №15 — им оказывается обфусцированный JS-код. Обфускация довольно простая (obfuscate.io), и следующим шагом можно попробовать ее деобфусцировать. Например, в deobfuscate.io — здесь получится как минимум переименовать названия функций из Hex в более читабельный формат.
Затем необходимо деобфусцировать вручную — с помощью дебага, запуска и, в случае хорошего владения JS, статического анализа кода,
Флаг: https://deobfuscate.io/
2. De-DoS me
Если открыть файл в Hex-редакторе, можно увидеть измененный dos-stub, который вшит в каждый mzpe-файл — легаси платформы msdos.
Если перейти по этой ссылке из dos-stub, то нас отправит на рикролл!
Задание проверяет понимание, как работает формат mzpe. Когда обнаружится измененный dos-stub, его сразу можно запустить в любом эмуляторе msdox —например, в DOSbox.
Запускаем наш файл — и получаем флаг!
Также можно вручную пройтись по всему asm-коду и найти флаг без эмуляции DOS — но это решение требует большего количества времени.
Флаг: DrWeb{un0_D05_D05_D05_m0d3}
3. Ping
Открывая данный файл мы можем увидеть простенькую пародию на pong.
Чтобы отреверсить какую либо игрушку надо бы в первую очередь узнать, на каком движке она была написана. Первое, что приходит в голову - это по быстрому проверить строки. По строкам можно быстр определить, что это godot.
Чтобы узнать, как декомпилировать Godot, можно обратиться к Google — и найти, например, этот репозиторий. После декомпиляции можно смотреть скрипты.
Если вкратце, то нас интересует скрипт ball.gd
Забиваем куда-нибудь байты, чтобы посмотреть их значение в ASCII и получаем флаг:
Флаг: DrWeb{P1n6_M3_P0n6_M3}
4. Glycine?
Си код, закомпиленный визуал студио, сверху накрыт нашим пакером.
Внутри уязвимый код, который требует ввести пароль, для того, чтобы отобразить флаг в base64. Нам даны нужные для входа пароль, который к сожалению не подходит. А еще даны адреса всех используемых переменных.
Если ввести пароль, который дан в задании, то результат будет следующим:
Нам требуется переполнить буффер так, чтобы заполнить нужную переменную паролем и получить таким образом флаг
Пример строчки для получения правильного фалага: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAae1ce347d9ca43b41c112a658cb3b03
Флаг: DrWeb{3xpl0173d_0r_R3v3r53d?}
5. Back to the Future
В этом задании с нашей стороны была допущена ошибка — поэтому мы помогали участникам CTF как могли.
Задание представляет из себя 64 битный ELF и подразумевает подбор правильной даты и подстановку этой даты в код, в виде числового значения, сам же timestamp должен сформировать часть флага:
Обведенный участок кода должен проверять нужную дату по годам</span>дням</span>неделям и тд, после чего вылетать, если дата не правильная. Если дата правильная, то запустится следующий участок кода, формирующий флаг:
Проблема в задании заключается в разнице форматов time_t и структуры struct tm, в частности в разной точке отсчета (в time_t отсчет начинается с 1/1/1970, в структуре c 1900 года).
В итоге, если не думать об этом и посчитать руками, то мы получим следующий timestamp (мы часто реверсим в статике, но не всегда знаем все подводные камни).
Переводим его во флаг, подобно тому, как это делает код:
Флаг: DrWeb{!T1M3_M4ch1n3}