✍️ Статья Обратный инжиниринг с использованием Radare2 (Reverse Engineering) (часть 2)

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

Tartuga

💰 Проверенный продавец
Регистрация
19.12.2019
Сообщения
93
Эта статья является продолжением первой статьи «Обратный инжиниринг с использованием Radare2 (Reverse Engineering)», где дано базовое введение в инструмент. Настоятельно рекомендуется начать оттуда, если вы этого ещё не сделали, поскольку первая часть охватывает самые основы.

Эта статья продемонстрирует некоторые другие интересные возможности Radare2, проведём вас через процесс решения простой задачи с программой в стиле Capture the Flag. Вы можете загрузить эту программу с GitHub (исполнимый файл crackme). Если вы уже ушли дальше и запустили это программу, вы увидите, что она требует от нас ввода пароля.

./crackme
What's the password?

Если мы попробуем ввести пароль, пусть даже неверный, то мы увидем сообщение, которое говорит о том, что мы потерпели неудачу.
./crackme
What's the password? test
You failed

Есть несколько способов разрешить эту проблему. Мы можем попытаться брут-форсить пароль, отправляя в программу множество различных комбинаций из букв, пока мы случайно не вычислим пароль. Длина стандартного пароля примерно 8 символов. Разумно предположить, что пароль составлен из больших и маленьких букв и, может быть, даже цифр. В соответствии с этим калькулятором, тогда подбор такого пароля займёт примерно 15 лет чтобы узнать его методом брут-форса. У меня нет столько времени на ожидание, поэтому я собираюсь использовать Radare2 для взлома пароля.

Точно также, как и в предыдущем уроке, мы начнём с использования rabin2, чтобы получить некоторую информацию об этой программе. Давайте запустим её с опцией -I, чтобы увидеть, с чем мы имеем дело.


Вывод:

arch x86
binsz 6759
bintype elf
bits 64
canary true
class ELF64
crypto false
endian little
havecode true
intrp /lib64/ld-linux-x86-64.so.2
lang c
linenum true
lsyms true
machine AMD x86-64 architecture
maxopsz 16
minopsz 1
nx true
os linux
pcalign 0
pic true
relocs true
relro partial
rpath NONE
static false
stripped false
subsys linux
va true

Точно также, как и в предыдущий раз, мы видим, что имеем дело с исполнимым файлом x64 Linux, который был написан на C. Эта информация интересная, но не особо нам помогает узнать, что же там за пароль. Может быть строки из исполнимого файла дадут нам ключ. Мы можем просмотреть их используя rabin2. Обычно мы используем флаг -z, но он показывает много вывода. Мы можем использовать флаг -zqq для показа только строк.


Полученный вывод:

What's the password?
radare2
Congratulations
What's the second password?
What's the third password?
You failed
Flag is: r2{%s %s %s}\n

ozfxmQJdCvE.jpg

Здесь мы можем видеть много интересных вещей! Мы видим сообщение, которое говорит “You failed” («вы потерпели неудачу»), которое мы получили когда ввели неверный пароль. Мы также можем видеть “Congratulations” («Поздравления»), которые, как можно предположить, мы получим когда введём правильный пароль. Мы также видим строку “radare2”. Мы можем предположить, что это может быть пароль. Может быть и не так, но от попытке хуже не будет.

./crackme
What's the password? radare2
Congratulations
What's the second password?

Отлично, мы узнали пароль! Иногда это не так просто, строка пароля может быть обфусцирована или зашифрована. В подобных случаях мы должны обратным инжинирингом узнать способ шифрования, но, как видим, в этот раз нам повезло.

Тем не менее теперь у нас спрашивают другой пароль, чтобы мы могли пройти в этом испытании дальше. Проверяя строки ещё раз, я больше не вижу ничего такого, что выглядит как пароль, поэтому нам нужно продолжить углубляться. Давайте загрузим исполнимый файл в radare2 и проанализируем его используя “aaa”. Эта команда проанализирует все функции, какие имеет программа.

r2 crackme
-- Pass '-j' to rabin2 to get the information of the binary in JSON format.
[0x000006f0]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for objc references
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Use -AA or aaaa to perform additional experimental analysis.

8tfv_EExSOs.jpg

Нам также следует поискать функцию main, поскольку с неё начинается программа.

[0x000006f0]> s main
[0x000007fa]>

Теперь, когда мы на функции main, мы переключимся в графический режим radare2. Это попоможет нам увидеть как программа течёт и увидеть, где выполняются проверки этих паролей. Для перехода в графический режим, используйте команду “VV”.


Вы должны увидеть ascii график radare2. Вы можете передвигаться по графику используя клавиши HJKL как в Vim или курсорные клавиши. Если вы посмотрите на первый блок в графике, вы можете увидеть проверку нашего первого пароля.

9-YZfa6PtA0.jpg

Вы можете увидеть в последних нескольких строчках, что принимается строка “radare2” и сравнивается с вводом пользователя используя функцию strcmp. Затем делается проверка, чтобы выяснить, строки одинаковые или нет. Если они не одинаковые, тогда мы следуем по зелёной линии t (которая означает, что условие истинно) вниз к этому блоку кода:

17nhrF8pK34.jpg

Мы можем видеть в верхнем блоке, что программа сравнивает некоторую величину с нулём. Если она не равна нулю, то выводится выражение “Flag is: r2{%s %s %s}”. Это должен быть наш флаг по завершению задания. К сожалению, вместо статичной строки, используется формат вывода строки, поэтому просто глядя на эту запись мы не знаем, каким будет флаг. Если эта переменная в первом блоке равна нулю, тогда он печатает сообщение “You failed”. Таким образом, из этого можно сделать вывод, что некоторая переменная, которая определяет, будет ли получен флаг, будет изменена, как только мы введём все правильные пароли. Давайте перейдём к вершине и посмотрим, что произойдёт, если мы получим правильный первый пароль.

Zq6ZsENYxxM.jpg

Итак, этот блок печатает строку с поздравлениями “Congratulations”, затем печатает запрос на ввод второго пароля “What’s the second password?”, затем он берёт нашу строку ввода используя scanf и пропускает его через функцию atoi. Функция atoi используется для конвертации строки в число, поэтому второй пароль должен быть числом! Мы можем видеть, что в блоке вывод atoi сравнивается со значением 0xf. Теперь если вы не знаете с ходу десятичное значение этого шестнадцатеричного числа, то у radare2 для вас имеется другой замечательный инструмент! Откройте новый терминал и используйте команду rax2 для конвертации значения 0xf в десятичное число.


Итак, второй пароль это 15! Давайте попробуем его и посмотрим, работает ли он.

./crackme
What's the password? radare2
Congratulations
What's the second password? 15
Congratulations
What's the third password?

Кажется нам ещё нужно вводить и третий пароль. Давайте продвинимся вниз к следующему блоку кода в radare2 и посмотрим, что нам нужно делать.

l5xC3OBD0WU.jpg

Это похоже на предыдущую проверку пароля, которую мы делали. Вы можем видеть, что спрашивается третий пароль, пользовательский ввод пропускается через atoi и сравнивается со значением 0x539. Если мы пропустим его через rax2, мы найдём, что это десятичный эквивалент 1337. Итак, мы вставляем его в качестве последнего пароля и получаем:

What's the third password? 1337
Congratulations
Flag is: r2{radare2 15 1337}

Отлично! Это дало нам наш флаг! Если бы это был настоящий Capture the Flag, тогда нам нужно было бы ввести куда-то это значение для получения очков.

Мы сумели получить пароли без необходимости запускать программу много раз и нам даже совсем не пришлось угадывать пароли. Обратный инжиниринг приложения, алгоритма его работы, дали нам всю необходимую информацию. Реверс-инжиниринг — очень удобный инструмент, который можно использовать в любых условиях, поскольку вы можете применить его, чтобы узнать всё, что делает приложение. Я надеюсь, что введение в radare2 было полезным для тех, кто хочет начать на этом поприще.

Спасибо за чтение и весёлого ревёрсинга!
 

📌 Золотая реклама

AnonPaste

Верх