ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Классика 2 [Writeup] (https://forum.antichat.xyz/showthread.php?t=1643535)

fara0n 12.06.2024 14:47

Добро пожаловать путник. Готовим печеньки с чайком и погнали.
Сегодня разберём таск из категории Реверс - Классика 2. Скачиваем архив, распаковываем и смотрим, что нам дали для препарирования.
У нас два файла classic_2_elf и classic_2_win.exe – из названий и расширений файлов, понятно, что один для linux один для windows (всем угодили).

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

Весь реверс будет проходить в программе IDA Pro 8.3.230608. Открываем IDA и файл classic_2_win.exe
Жмём F5, чтобы увидеть читаемый код. Попробуем понять.

https://forum.antichat.xyz/attachmen...8187539029.png

Есть куча переменных, таких как v3, v4, v9, v10, v11, v12, массивы Str1, v7, Buffer

Массив Str1 заполняется следующими значениями:

https://forum.antichat.xyz/attachmen...8187632882.png

В массив v7 копируется значение “R]h[[4”, об этом нам говорит строчка из кода:

https://forum.antichat.xyz/attachmen...8187664170.png

Далее постараюсь описать код:

https://forum.antichat.xyz/attachmen...8187939809.png

А вот далее, начинается вся магия:

https://forum.antichat.xyz/attachmen...8188323188.png

Общая суть получается такой:
1) Вводим какой-то ответ
2) Он сверяется с массивом Str1
3) Если ввели верно, выводим сообщения: You're right!, This is your flag! =D т.е. ответом на сообщение должен быть флаг (который мы хотим получить) …
4) Иначе, выводим сообщение: That's not it...

Хорошо, теперь мы понимаем, что ответом на Answer должен быть флаг. Флагом на площадке является строка вида: Antichat{…..} и раз, наш ответ сравнивается с массивом Str1, это значит, что Str1 и есть наш флаг. Осталось привести его в читаемый вид. Для этого мы вспоминаем, что наш ответ сначала проходит преобразование через ф-цию sub_1229 и только потом сравнивается с Str1. Поэтому, поставим так называемый бряк (break) на строчке 54 (где сравниваются ответ и Str1) кликнув ЛКМ по кружку. Должно получиться вот так:

https://forum.antichat.xyz/attachmen...8188653678.png

И запускаем программу в режиме отладки. Для этого, в верхнем меню, где у вас будет надпись: 'No debugger' выбираем 'Local Windows debugger' и нажимаем на зелёную стрелку рядом.

https://forum.antichat.xyz/attachmen...8188713688.png

Если выскочит предупреждение тыкаем: yes
Введём слово Antichat т.к. флаги начинается именно с него, далее Enter и возвращаемся в IDA, снова F5 и видим, что мы остановились именно на функции сравнения. Теперь, если мы подведём курсор мыши на Str1, мы увидим, какие символы там находятся, именно они сравниваются с нашим введённым ответом, который лежит в массиве Buffer
Массив Str1:

https://forum.antichat.xyz/attachmen...8188797842.png

Массив Buffer:

https://forum.antichat.xyz/attachmen...8188819293.png

Как видите, наше введённое слово преобразовалось в те же символы, что лежат вначале Str1!
Суть моего решения заключается в следующем:
1) Запускаем программу в режиме отладки, и прогоняем все маленькие буквы, большие буквы, цифры, спецсимволы через ф-цию sub_1229;
2) Создаём словарь в виде 'ключ' : 'значение' где в качестве ключа будет то, что мы вводили, а значение – то, что выдалось после преобразования через функцию;
3) Выписываем все значения Str1;
4) Находим по значениям наши ключи и таким образом получим наш флаг.

Знаю, что многие закидают меня тапками, но весь код на python я приводить не буду.
Но вот вам помощь, готовый словарь, который поможет получить флаг:

Python:


Код:

dict
=
{
'A'
:
'\xF8'
,
'B'
:
'\xF7'
,
'C'
:
'\xF6'
,
'D'
:
'\xFD'
,
'E'
:
'\xFC'
,
'F'
:
'\xFB'
,
'G'
:
'\xFA'
,
'H'
:
'\x01'
,
'I'
:
'\0'
,
'J'
:
'\xFF'
,
'K'
:
'\xFE'
,
'L'
:
'E'
,
'M'
:
'D'
,
'N'
:
'C'
,
'O'
:
'B'
,
'P'
:
'I'
,
'Q'
:
'H'
,
'R'
:
'G'
,
'S'
:
'F'
,
'T'
:
'M'
,
'U'
:
'L'
,
'V'
:
'K'
,
'W'
:
'J'
,
'X'
:
'Q'
,
'Y'
:
'P'
,
'Z'
:
'O'
,
'1'
:
'h'
,
'2'
:
'g'
,
'3'
:
'f'
,
'4'
:
'm'
,
'5'
:
'l'
,
'6'
:
'k'
,
'7'
:
'j'
,
'8'
:
'q'
,
'9'
:
'p'
,
'0'
:
'i'
,
'!'
:
'\x98'
,
'@'
:
'\xF9'
,
'#'
:
'\x96'
,
'$'
:
'\x9D'
,
'%'
:
'\x9C'
,
'^'
:
'S'
,
'&'
:
'\x9B'
,
'*'
:
'\x9F'
,
'('
:
'\xA1'
,
')'
:
'\xA0'
,
'-'
:
'd'
,
'+'
:
'\x9E'
,
'_'
:
'R'
,
'='
:
't'
,
'.'
:
'c'
,
','
:
'e'
,
'{'
:
'.'
,
'}'
:
'4'
,
'a'
:
'X'
,
'b'
:
'W'
,
'c'
:
'V'
,
'd'
:
']'
,
'e'
:
'\\'
,
'f'
:
'['
,
'g'
:
'Z'
,
'h'
:
'a'
,
'i'
:
'`'
,
'j'
:
'_'
,
'k'
:
'^'
,
'l'
:
'%'
,
'm'
:
'$'
,
'n'
:
'#'
,
'o'
:
'#'
,
'p'
:
')'
,
'q'
:
'('
,
'r'
:
'\''
,
's'
:
'&'
,
't'
:
'-'
,
'u'
:
','
,
'v'
:
'+'
,
'w'
:
'*'
,
'x'
:
'1'
,
'y'
:
'0'
,
'z'
:
'/'
}

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

Спасибо что дочитал до конца бро. Удачи в тасках.

nsk 13.06.2024 09:55

На то оно и реверс. Прогоняем массив str1 в обратном порядке.
Примерно так:
for i in str1:
i+=0x1e
i^=0x22
i-=0x34
i^=0x41
Выводим результат. Чутка правим. Все!


Время: 19:05