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

Источник: https://medium.com/@jacob16682/reverse-engineering-with-radare2-part-2-83b71df7ffe4

Эта статья является продолжением первой статьи «Обратный инжиниринг с использованием 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, чтобы увидеть, с чем мы имеем дело.

rabin2 -I crackme

Вывод:

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 для показа только строк.

rabin2 -zqq crackme

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

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

Здесь мы можем видеть много интересных вещей! Мы видим сообщение, которое говорит “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.

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


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

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

[0x000007fa]> VV

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

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

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

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

rax2 0xf
15

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

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

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

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

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

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

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

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

Рекомендуется Вам:

Добавить комментарий

Ваш e-mail не будет опубликован.