![]() |
Хотели порешать эти ваши реверс-инжиниринги на CTF? Да ещё и на C++ с Windows Forms? К тому же чтобы он был не сложным и в райтапе были объяснения? Тогда вам сюда
Ссылка на задание (файлы): нажми на меня В архиве будет лежать Код:
cross_cr.exeКод:
CODEBY{FLAG}План статьи
1. Статический анализ файла 1.1 Detect It Easy Начнём анализ исполняемого файла с помощью утилиты Detect It Easy (далее DIE). DIE не обнаружил никаких упаковщиков/протекторов и прочих средств защиты. Сам таск свежий, если верить отметки времени. Кроме того он с графическим интерфейсом. Посмотрим информацию о файле через продвинутый анализ. Карта памяти В карте памяти аномалий не выявлено. Энтропия Файл кажется сжатым, но если смотреть по секциям, то наиболее сжатый по энтропии - это секция ресурсов ( Код:
.rsrcСтроки Поиск по строкам дал нам возможные ориентиры, на места в коде с выводом сообщение о флаге и о проигрыше. Также названия некоторых функций и пока что непонятное Код:
MASTER_OF_CODEBYИмпорты Из импортов чего-то "слишком криминального" не выявлено. Но есть Код:
IsDebuggerPresentПримечание: Хоть функция Код:
IsDebuggerPresentАнализ заголовков По заголовкам всё выглядит нормально для EXE-файла. Виртуализация Бывает полезно посмотреть таким образом на файл. По графическому представлению видно, что ресурсы занимают больше всего места в этом исполняемом файле. Ресурсы Теперь понятно, откуда такой размер. Это PNG-файл. Посмотрим более детально в Resource Hacker. 1.2 Resource Hacker Это иконка. Если смотреть на неё в Hexdump'е (Binary View) ничего странного не видно. 1.3 Hex-редактор Иногда в конце исполняемых файлов некоторых тасков что-то можно найти. Но тут ничего странного нет. 2. Динамический анализ Динамический анализ в Autoruns, Process Monitor, Process Hacker и Wireshark не показал ничего необычного. 3. Анализ в IDA Примечание: далее будет использована IDA Freeware 8.4. Её хватит с головой Но вы также можете использовать Ghidra, Cutter (Radare2) или любой другой отладчик, который вам нравится. Код в декомпиляторах будет +- похожим. 3.1 Поиск сообщения о неправильном флаге Попробовав запустить файл и ввести что-то в поля для ввода, мы наблюдаем вызов функции Код:
MessageBoxЗапустим IDA и попробуем найти код, что вызывает этот Код:
MessageBoxРусские символы по умолчанию не отображаются. Для этого нужно нажать правую кнопку мыши (далее ПКМ), затем Код:
SetupОпция Unicode нужна, чтобы нормально отображались символы из 16-битных кодировок в стандарте Unicode. Строки в 16-битной кодировке активно используются в WinAPI. Галочку со Strict ASCII мы убираем для поиска русских символов (в том числе для опции Unicode). Но для нормального отображения нам нужно зайти ещё сюда. Затем тут выставляем Код:
cp1251Далее нажимаем Rebuild и видим русские символы. Первых символов не видно, но понять можно. Жмём на "хх..." (от Эхх...). Нужно представить эти байты как строку. Жмём ALT+A, затем сюда. Байты представились как текст в кодировке UTF-16LE (UTF-16 Little Endian). Наводим курсор на название строки ( Код:
aEВидим 2 блока, ведущих к Код:
MessageBoxWКод:
unkЧерез клавишу N можно поменять название ноды графа, наведя курсор на его первую инструкцию. Кроме этого можно задать цвет через ПКМ или специальную иконку. Более того мы сразу попали на функцию проверки ввода. 3.2 Анализ функции и начало сбора флага Составим краткий "скелет" функции через декомпилятор - клавиша F5. В IDA Freeware онлайн-декомпилятор, поэтому иногда он может быть недоступен. Учтите это, если будете пробовать сами. Через клавишу N можно менять названия объектов. Убедиться, что эта функция используется для проверки нашего ввода можно, если навести курсор на её название и нажать X. А далее посмотреть, где вызывается. Эту функцию можно назвать так. Она обрабатывает сообщения от GUI-окна. По коду 0x111 (WM_COMMAND) вызывается наша функция проверки ввода. На Код:
check_inputC++: Код:
intC++: Код:
memsetСразу дадим нормальные имена, чтобы повысить читаемость. Через отладку можно понять, где будет что. В данном случае в поле имени было введено "qwe". Следующая часть кода выполняет подсчёт длины строки с флагом: C++: Код:
v0Флаг должен быть длиною в 27 символов. Следующий кусок кода: Первое условие из выделения со скрина проверяет, что начальные 7 символов флага - это Код:
CODEBY{Код:
}Листинг дизассемблера: Таким образом сейчас у нас есть следующее представление флага: Следующий блок кода: Листинг дизассемблера: Данный блок кода проверяет часть флага между фигурными скобками {}. Она должна быть такого вида: Код: Код:
-XXXX-XXXX-XXXXКод:
XНемного странно, что в этой проверке упущена часть перед первым Код:
-Затем идёт такой блок: Он преобразует строку с числом между символами Код:
-Листинг дизассемблера: Следующий блок кода сравнивает введённое имя со строкой Код:
MASTER_OF_CODEBYЛистинг дизассемблера: 3.3 Составляем "тело флага" Посмотрим на следующий блок: Он выполняет шифрование чисел через простые операции и сравнивает их с нужными. Листинг дизассемблера: Перепишем это в более понятном виде: C++: Код:
first_decimalТеперь останется просто применить противоположные операции в обратном порядке к нужным значениям.
C++: Код:
first_decimalКод: Код:
9312-8831-4294972108-1221Код: Код:
CODEBY{9312-8831-4294972108-1221}Представим число 4294972108 в 16-ом виде: Код: Код:
0x1000012CCКод: Код:
0x00 00 12 CC (по байтам)Делиться открытым флагом не буду, дальше вы сами добьёте таск! Спасибо за прочтение статьи! |
О, классно!
Не знал как русские символы отобразить и поэтому не мог найти шифрование флага, а дальше сам всё решил не читая дальше статью Но за раскрытие темы спасибо! |
На счёт кстати третьего ключа, решил брутфорсом. Метод глупый конечно, но рабочий
Python: Код:
>> |
Цитата:
|
Цитата:
P. S. Поэтому я даже сначала и не понял о каком "шифровании" вообще идет речь в статье |
Цитата:
|
Цитата:
|
| Время: 22:44 |