Добро пожаловать путник. Готовим печеньки с чайком и погнали.
Сегодня разберём таск из категории Реверс - Классика 2. Скачиваем архив, распаковываем и смотрим, что нам дали для препарирования.
У нас два файла classic_2_elf и classic_2_win.exe – из названий и расширений файлов, понятно, что один для linux один для windows (всем угодили).
Сразу оговорка, я не ПРО реверсер, поэтому, мой способ длительный, не самый оптимальный, но простой для понимания. Поэтому, кто решал иначе, делимся в комментах.
Весь реверс будет проходить в программе IDA Pro 8.3.230608. Открываем IDA и файл classic_2_win.exe
Жмём F5, чтобы увидеть читаемый код. Попробуем понять.
Есть куча переменных, таких как v3, v4, v9, v10, v11, v12, массивы Str1, v7, Buffer
Массив Str1 заполняется следующими значениями:
В массив v7 копируется значение “R]h[[4”, об этом нам говорит строчка из кода:
Далее постараюсь описать код:
А вот далее, начинается вся магия:
Общая суть получается такой:
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) кликнув ЛКМ по кружку. Должно получиться вот так:
И запускаем программу в режиме отладки. Для этого, в верхнем меню, где у вас будет надпись: 'No debugger' выбираем 'Local Windows debugger' и нажимаем на зелёную стрелку рядом.
Если выскочит предупреждение тыкаем: yes
Введём слово CODEBY т.к. флаги начинается именно с него, далее Enter и возвращаемся в IDA, снова F5 и видим, что мы остановились именно на функции сравнения. Теперь, если мы подведём курсор мыши на Str1, мы увидим, какие символы там находятся, именно они сравниваются с нашим введённым ответом, который лежит в массиве Buffer
Массив Str1:
Массив Buffer:
Как видите, наше введённое слово преобразовалось в те же символы, что лежат вначале Str1!
Суть моего решения заключается в следующем:
1) Запускаем программу в режиме отладки, и прогоняем все маленькие буквы, большие буквы, цифры, спецсимволы через ф-цию sub_1229;
2) Создаём словарь в виде 'ключ' : 'значение' где в качестве ключа будет то, что мы вводили, а значение – то, что выдалось после преобразования через функцию;
3) Выписываем все значения Str1;
4) Находим по значениям наши ключи и таким образом получим наш флаг.
Знаю, что многие закидают меня тапками, но весь код на python я приводить не буду.
Но вот вам помощь, готовый словарь, который поможет получить флаг:
Так же обращаю ваше внимание, что в Str1 храниться не весь флаг, окончание флага храниться в массиве v7, поэтому не забудьте соединить Str1 и v7
Спасибо что дочитал до конца бро. Удачи в тасках.
Сегодня разберём таск из категории Реверс - Классика 2. Скачиваем архив, распаковываем и смотрим, что нам дали для препарирования.
У нас два файла classic_2_elf и classic_2_win.exe – из названий и расширений файлов, понятно, что один для linux один для windows (всем угодили).
Сразу оговорка, я не ПРО реверсер, поэтому, мой способ длительный, не самый оптимальный, но простой для понимания. Поэтому, кто решал иначе, делимся в комментах.
Весь реверс будет проходить в программе IDA Pro 8.3.230608. Открываем IDA и файл classic_2_win.exe
Жмём F5, чтобы увидеть читаемый код. Попробуем понять.
Есть куча переменных, таких как v3, v4, v9, v10, v11, v12, массивы Str1, v7, Buffer
Массив Str1 заполняется следующими значениями:
В массив v7 копируется значение “R]h[[4”, об этом нам говорит строчка из кода:
Далее постараюсь описать код:
А вот далее, начинается вся магия:
Общая суть получается такой:
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) кликнув ЛКМ по кружку. Должно получиться вот так:
И запускаем программу в режиме отладки. Для этого, в верхнем меню, где у вас будет надпись: 'No debugger' выбираем 'Local Windows debugger' и нажимаем на зелёную стрелку рядом.
Если выскочит предупреждение тыкаем: yes
Введём слово CODEBY т.к. флаги начинается именно с него, далее Enter и возвращаемся в IDA, снова F5 и видим, что мы остановились именно на функции сравнения. Теперь, если мы подведём курсор мыши на Str1, мы увидим, какие символы там находятся, именно они сравниваются с нашим введённым ответом, который лежит в массиве Buffer
Массив Str1:
Массив Buffer:
Как видите, наше введённое слово преобразовалось в те же символы, что лежат вначале 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
Спасибо что дочитал до конца бро. Удачи в тасках.