![]() |
Добро пожаловать путник. Готовим печеньки с чайком и погнали.
Сегодня разберём таск из категории Реверс - Классика 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Спасибо что дочитал до конца бро. Удачи в тасках. |
На то оно и реверс. Прогоняем массив str1 в обратном порядке.
Примерно так: for i in str1: i+=0x1e i^=0x22 i-=0x34 i^=0x41 Выводим результат. Чутка правим. Все! |
| Время: 19:05 |