Друзья, мы продолжаем публиковать решения нашего CTF марафона! В нем было пять уровней сложности, в каждом по пять заданий, всего 25 заданий. Каждую неделю мы выкладываем 5 решений — сегодня речь о третьем уровне сложности. Вы можете проверить предыдущие уровни здесь: часть 1, часть 2.

Результаты марафона мы подвели итоги в начале апреля, но домашняя работа еще доступный — и вы можете попробовать решить их самостоятельно.

Doctor Web CTF-2023: Задания эпического уровня

1. Заряди меня

Задание проверяет понимание языка ассемблера и знание байт-кода в целом. Задача получает шеллкод — открыв его байткод в Hiew и установив размер инструкции x32, можно увидеть следующую картинку:

Чтобы получить флаг, вам нужно прочитать ASM, взять ярды и использовать xor, чтобы разбить их на «ключи» как соседние ярды. Получаем флаг: «DrWeb{5h3ll_u53r_}».

2. Мастер подземелий

Задание дает небольшой набор текста под Linux:

Если в качестве ответа ввести случайный набор символов, игра заканчивается одним из вариантов ответа:

Для первого задания можно просто найти вшитый простой текст ответа, поэтому найдите его и вставьте:

Теперь нам уже предстоит найти два ключа, и на этот раз они не зашиты в код простым незашифрованным текстом.

Если вы вводите случайный набор символов, набор дает следующий ответ:

Поскольку это не сработало, вы должны посмотреть на код. После этого не получилось, смотрим код, находим две функции похожего формата, обе расшифровывают ключи обычным xor с ключом «11111111»

Получаем два ключа: «0—open» и «door—0»:

Переходим на третий уровень:

ЧИТАТЬ   Почему Лукашенко добивается нового мандата

Пытаемся что-то угадать и победить дракона:

Иногда рандомно что-то даже срабатывает, но только рандомно:

Проанализировав код, можно понять принцип, по которому работает эта битва:

Получается, что схватка с драконом — это последний уровень, и правильные результаты сразу пойдут на флаг:

Флаг формируется по следующему принципу: DrWeb{[A-H][P-Z][#$%&][a-h][p-z]}.

Формируем флаг: «DrWeb{AH#er}». Для каждого участника это может быть разным.

3. Суть искусства в DrWeb!

Совсем не сложная задача, если вы знаете, что здесь можно сделать. 😊

Скачиваем файл, открываем его, видим следующее изображение в формате .png:

В образе нет ничего лишнего, в нем ничего не зашифровано, это всего лишь изображение, причем не самого большого размера. И чтобы найти флаг, вам нужно провести небольшое исследование.

В одна из первых работ использовался эзотерический язык LOLCODE — и если вы помните это и изучаете, какие есть другие эзотерические языки, вы можете найти язык Piet. Добавим от себя, что писать на этом языке было очень нетривиальной задачей! 😊

Предполагая, что файл написан на этом конкретном языке, вы можете попробовать решить задачу. Для этого нужно использовать специальную утилиту для запуска Пита — например, Этот. Вы также можете использовать инструменты из GitHub. Вот так выглядит сайт, который мы выбрали для работы:

Загружаем наш образ, открываем отладчик, нажимаем запустить и смотрим:

Далее остается дождаться выполнения всей программы:

Пример: «DrWeb{P41n7_M3_70_7h3_P137}».

4. Беспредел Робо

Задание дается игре, в которой где-то приземляется вредоносное ПО…

Для того, чтобы найти флаг, необходимо выполнить несколько условий, что заведомо невозможно:

  1. Набрать 65535 шт.

  2. Сократите количество своих жизней до нуля.

  3. Уничтожьте всех врагов.

Для решения задачи важно отметить подсказку, которая дается при открытии файла — это Godot:

ЧИТАТЬ   Древнюю крепость в Испании спасут от разрушения бактерии

Поэтому для решения задачи есть два инструмента: декомпилятор Godot и чит-движок.

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

Код был запутан вручную, и деобфускатор недоступен для общего доступа. Можно попробовать восстановить скрипт с помощью логики и найти ключ, а можно попробовать отладить код — запустить проект в Godot и при отладке менять значения переменных, аналогично Cheat Engine.

Выполнить первое условие и ликвидировать количество монет достаточно просто, так как счетчик может постоянно обновляться. Для этого вам нужно запустить чит-движок, чтобы найти текущее количество монет, и как только новые монеты будут подобраны, запустить новый поиск и отсортировать результаты. Первое условие выполнено.

В итоге получаем вот такую ​​подсказку, указывающую, что нужно делать дальше:

Далее нужно найти переменную, отвечающую за жизнь персонажа. Сделать это можно будет методом тыка — и после того, как искомое значение будет найдено, его нужно заменить на ноль. Второе условие выполнено.

Измените настройки, чтобы уменьшить HP до нуля:

Для выполнения третьего условия нужно уничтожить всех врагов, но есть проблема — некоторые из них сидят в «бункере», куда персонаж не может спуститься:

Вам нужно найти настройки, отвечающие за координаты персонажа, и если их изменить, то вы сможете телепортироваться в «бункер». Координаты даже не скрыты:

Методом проб, ошибок и блокировок в стенах получается поставить персонажа в нужное место и уничтожить противников:

Третье условие выполнено — и в одной из переменных находим флаг:

После этого мы уже получаем флаг: «DrWeb{Pl4y_64m3_Ch347}».

5. Билеты, пожалуйста

Задача получает два файла: исполняемый файл и ticket.png. Изображение билета выглядит так — и важно отметить, что срок действия «билета» истек:

ЧИТАТЬ   «Попахивает дискриминацией»: отец выпускницы обвинил Челябинский вуз в предпочтениях иностранцев

Глядя на тикет через hex-редактор, можно увидеть фрагмент, отвечающий за проверку тикета:

Размер XML явно меньше этого xml_size, но код не проверяет XML на корректность, можно не обращать внимания на эту настройку — возможно размеры сдвинулись из-за ошибки кодировки файла.

Получается, что файл смотрит на следующие конструкции: « «, « «, « «.

IDA не в восторге от оптимизированного кода, но в его детальном восстановлении нет необходимости — конструкции не такие сложные: std::strings получает значение c_str.

Вы можете увидеть проверку флага — это происходит в « «:

Также есть валидация по времени:

Теперь можно пропустить проверку в отладчике — или исправить «тикет»:

При такой конфигурации программа пропускает тикет.

Затем по адресу 00401970 находится фрагмент, который расшифровывает определенную полезную нагрузку с помощью ключа, который был передан через билет. Если вы откроете его код, вы увидите, что он загружает адреса функций RegCloseKey, RegCreateKeyExA, RegOpenKeyExA, RegSetValueExA для использования в полезной нагрузке. Сами значения ключей не видны — пейлоад вшит не просто так.

Теперь мы знаем, что запись будет происходить в ключах реестра, поэтому проще всего не реверсировать шеллкод, а запустить procmon и найти там наш исполняемый файл.

В итоге в реестре дается новый ключ, там оказался вшит флаг.

Индикатор: «DrWeb{R3g1s7r0g3d0n}».

Source

От admin