• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Классика 2 [Writeup]

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

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

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

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

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


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


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


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


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

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


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


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


Массив Buffer:
1718188819293.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

Спасибо что дочитал до конца бро. Удачи в тасках.
 
  • Нравится
Реакции: Edmon Dantes

nsk

One Level
17.04.2022
3
3
BIT
62
На то оно и реверс. Прогоняем массив str1 в обратном порядке.
Примерно так:
for i in str1:
i+=0x1e
i^=0x22
i-=0x34
i^=0x41
Выводим результат. Чутка правим. Все!
 
  • Нравится
Реакции: DANIL BALDIN и fara0n
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!