Данное описание подготовлено и публикуется со слов участника CTF, занявшего почетное второе место – Сементинова Сергея ( @cema_rus ). Мы разбили прохождение реверста на несколько статей потому что они достаточно обширны и подробны, это первая, вот вторая часть c Deep.exe и третья c Final.exe. Дальше текст передается as-is.

Первыми шагами в этом деле стало решение маленькой кучки задач с одного из сайтов crackme, на котором рядовые пользователи пишут свои версии подобных задач и выкладывают для решения в массы. Но интерес там ничем не поддерживался и он угас после решения 3-4 задач. Но полученный опыт остался, а значит задания в рамках CTF можно считать уже вторым шагом в этом направлении.

Рассмотренные ниже задания были в разделе Реверс-Инжиниринг на прошедшем в июле 2023 года мероприятии CTF@dc78422.ru; Задача для каждого задания, как обычно, вычислить некую последовательность, которую программа приняла бы за “правильную”.

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

Task1.exe

Программа совершенно не хотела запускаться, постоянно ругалась на отсутствие тех или иных библиотек, поэтому было решено не париться, открыть его в Notepad++ и листать вниз, в надежде увидеть хоть что-то интересное. Каково же было моё удивление, когда примерно в середине файла нашлись строки в “чистом виде”:

Task1.exe

К сожалению в программе проверить не получилось (она так и не запускалась), поэтому этот флаг сразу отправился в задание на сайте - Correct!

Task2.exe

У этой программы с запуском проблем уже не было. На фоне предыдущего “успеха”, сразу открываем в Notepad++ и ищем какие-нибудь строки. И снова “удача”:

Task2.exe_1

Кто знает, что такое кодировка BASE64, тот в любом месте без особых проблем увидит закодированные данные и будет знать, что с ними делать. В нашем случае - один из плагинов Notepad++ декодирует эти данные, проверяем полученный флаг сначала в программе, потом на сайте - Correct!

Task2.exe_2

Task3.exe

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

Task3.exe_1

И сразу всё становится ясно, что и где пошло не так) Теперь, главное - как его распаковать для дальнейшего изучения. Второй ссылкой поиска по запросу “upx windows” нашлись готовые релизы упаковщика. Качаем, распаковываем, смотрим справку и выполняем команду:

Task3.exe_2

Ну и, по традиции, смотрим его в блокноте. Результат проверяем в программе, потом на сайте - Correct!

Task3.exe_3

taskSyzran.exe

Ученые предыдущим опытом, сразу смотрим информацию о файле taskSyzran.exe и видим, что компилятор Embarcadero Delphi(XE7), а значит в помощь себе можно использовать программу Interactive Delphi Reconstructor (https://github.com/crypto2011/IDR). Что, куда и как - расскажу в последнем задании. Сейчас же просто скажу, что в результате получаем более читаемую декомпиляцию и начинаем ее изучать:

taskSyzran.exe_1

Даже не “причесывая” код, видно, что флаг будет считаться правильным, если результат выполнения sub_41A424(dword_423EBC) будет отличен от нуля. Идем смотреть и разбирать функцию. Я покажу уже разобранный вариант:

taskSyzran.exe_2

В 40й строке операция отрицания (~) эквивалентна операции XOR 0xFF, а значит наш флаг посимвольно XORится и сравнивается с неким массивом. Другими словами, если этот массив посимвольно заXORить с 0xFF, то мы получим наш флаг. Достаем массив:

taskSyzran.exe_3

И XORим его. Я использовал сервис XOR Calculator (https://xor.pw/):

taskSyzran.exe_3

Результат проверяем в программе, потом на сайте - Correct!


Файлы заданий