CTF. Reverse. Задания с Root-Me, часть #1.

by I'm Sorry
CTF. Reverse. Задания с Root-Me, часть #1.


В случае заимствования данной информации, указывайте авторство - Telegram-канал "HimJost".

Данный пост будет носить практический характер. В нём мы рассмотрим задание начального уровня в категории Reverse. Рассматриваемое задание встречается на CTF'ах среднего и высокого уровня.

Задания будут взяты с известного сайта с различными задачами (CTF и не только) - https://www.root-me.org/

Будем решать задачи из категории Cracking.

Прямая ссылка: https://www.root-me.org/en/Challenges/Cracking/


О категории Reverse.

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


Пример 1.

Сегодня попытаемся разобрать интересное задание на ревёрсинг игры для GameBoy.

Название задания - "GB - Basic GameBoy crackme"

Прямая ссылка на задание - https://www.root-me.org/en/Challenges/Cracking/GB-Basic-GameBoy-crackme

Прочтём описание.

Нам сказано найти секретный путь для решение данного задания, а также указывается как контролировать смайлик (чтобы это не значило).

Качаем архив который дан к задания и видим там следующий файл.

Судя по всему это дамп памяти для игры. Наверняка его можно сэмулировать.

В прикреплённых источниках мы можем найти ссылку на мануал по работе процессора GameBoy'a (если кто не знает, это такая старая портативная приставка).

Мануал на 139 страниц, изучать подробно это не особо хочется, тем более что нам надо решить один конкретный таск, поэтому пойдём гуглить как это нормально ревёрсить и возможно потребуется это всё сэмулировать.

Немного погуглив можно наткнуться на вот такую статью в которой ревёрсят тоже какую-то игру (ссылка), там же можно найти ссылку на эмулятор (ссылка).

Скачаем эмулятор и запустим его с нашим дампом.

Видим смайлик, который управляется стрелочками и лог передвижений слева. Немного "побегав" смайликом можно понять, что ничего интересного здесь больше не найти. Нужно ревёрсить.

В выше указанной статье использовался radare2, т.к. он имеет поддержку "из коробки" таких дампов. После ряда неудачных попыток загрузки данного дампа в IDA, radare2 кажется не таким плохим решением. Попробуем использовать его.

Однако, возьмём не чистый radare2 а его GUI-интерфейс cutter.

Загрузим файл и увидим примерно следующее.

Интерфейс не самый приятный, но по крайне мере мы теперь видим код. Попробуем найти строчки, ведь мы видели, что строки отображаются слева в зависимости от нажатия той или иной стрелочки.

Отлично, мы нашли строку с флагом "FLAG IS: %s\n", теперь надо найти ссылки на неё, чтобы понять в какой части кода к ней происходит обращение и что передаётся в качестве аргумента (ведь как можно заметить это форматная строка).

Находим ссылки на эти строки и видим примерно следующий код.

Тоже самое можно найти и для остальных кнопок. Находим код печати флага и видим блок сравнений некоторых значений из памяти.

Значения извлекаются из адресов 0xc0b0, 0xc0b1, 0xc0b2, 0xc0b3.

Посмотрим код нажатия кнопки Right.

Значение по адресу 0xc0b0 уменьшается на единицу, а также значение по адресу 0xc0b4 тоже уменьшается на единицу.

Заметим, что на экран будет выводится значения с адреса 0xc0b4.

В целом мы поняли, что при нажатие определённой клавиши уменьшается значение в текущей ячейке, теперь надо понять как нам получить первоначальные значения.

Для этого нам нужен какой-нибудь эмулятор с возможностью просмотра памяти. Можно найти вот такой инструмент - ссылка

Откроем наш дамп в нём и запустим отладчик.

Находим по адресу некоторые значения (при этом вы не должны были делать никаких действий в игре).

Таким образом мы получаем начальные значения.

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

Теперь надо провести соответствие с позицией значения и нажимаемой кнопкой.

0 - Вправо (Right)

1 - Влево (Left)

2 - Наверх (Up)

3 - Вниз (Down)

Теперь выпишем значения которые должны быть в конце.

0x32 - для ячейки 0xc0b0

0х30 - для ячейки 0xc0b1

0x37 - для ячейки 0xc0b2

0x38 - для ячейки 0xc0b3

Создадим небольшой скрипт.

Получим строку "r0m1", попробуем сдать её как флаг.

Отлично мы решили задание, оно было достаточно не простым, но интересным.


Если у вас остались вопросы по решению задания или в целом по хакингу, то напишите мне в лс @Im50rry

March 22, 2019
by I'm Sorry
Хакинг