Отладка приложения в Windows с Radare2


Источник: https://medium.com/@jacob16682/debugging-using-radare2-and-windows-5e58677bf943, автор: Jacob Pimental.

Начать я хочу с заявления: я — Linux парень. Я использую её всё время для разработки. Командная строка великолепна и потрясающе удобна для задач связанных с компьютерной наукой. И хотя это мой путь, имеются те, кто предпочитает вместо этого использовать окружение Windows. Поэтому в данной статье я хочу показать две вещи: как установить и использовать radare2 для Windows и как делать отладку приложений используя radare2.

Как установить radare2 в Windows

Скачать установщик под Windows вы можете с официального сайта по ссылке: https://www.radare.org/r/down.html

По какой-то непонятной причине, на момент написания файл для Windows не найден: 404 Not found

Исходный код программы присутствует на GitHub'е, там же можно найти скомпилированные файлы, в том числе для Windows: https://github.com/radare/radare2/releases (файлы для Windows называются radare2-msvc_*.zip)

Программа является портативной, поэтому вы можете распаковать архив в любое место и запускать файл с указанием полного пути до него. Как вариант, можно добавить папку в переменную окружения $PATH.

Переменная окружения $PATH — это просто переменная, в которой перечислены папки, и которую компьютер использует для поиска исполнимых файлов. То есть если утилита (команда) и приложения размещены в одной из этих папок, то такую команду (приложение) можно запустить по имени файла — не нужно указывать полный путь до него (даже необязательно указывать расширение файла).

Я распаковал содержимое скаченного архива (файл radare2-msvc_64-3.4.1.zip) в корень C:, и папку переименовал в radare2. Таким образом исполнимые файлы Radare2 находятся в папке C:\radare2\ - именно этот путь я и добавлю в переменную окружения.

Для этого открываю Панель управления → Система и безопасность → Система → Дополнительные параметры системы → Переменные среды:

Там найдите Path и нажмите Изменить:

Нажмите кнопку Создать, впишите C:\radare2\ и нажмите ОК:

Чтобы убедиться, что всё сделано правильно, откройте командную строку и введите туда:

radare2.exe -h

Кстати, добавить новый путь в переменную окружения можно было прямо в командной строке (если вы это сделали через графический интерфейс, то второй раз добавлять не нужно):

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\radare2\", [EnvironmentVariableTarget]::Machine)

Это удобно, и radare2.exe как и любые утилиты можно запускать в командной строке по имени файла.

Отладка с Radare2 в Windows

Теперь, когда программа Radare2 установлена, мы можем перейти к нашему уроку по отладке (debugging). Если вы не знаете, что такое отладка, то говоря простыми словами, это запуск программы и приостановка её на каждой инструкции Ассемблера. Это позволяет вам динамически видеть, что происходит под капотом и это часто это во много раз проще, чем статичный анализ. Тем не менее во время анализа вредоносной программы безопаснее выполнять статичный анализ, когда файл на самом деле не запущен. Если вы хотите делать отладку вируса, ведь это важная часть процесса анализа, тогда вам следует это делать в виртуальной машине.

Я продемонстрирую, как разрешить Challenge 2 из Flare-On 4 Capture the Flag challenge. Flare-On challenge — это ежегодное соревнование по Обратному Инжинирингу (Reverse Engineering) проводимое FireEye. Всем заинтересованным в обратном инжиниринге я настоятельно рекомендую хотя бы попробовать, поскольку вы можете из них научиться очень многому. С их сайта вы можете загрузить исполнимые файлы от прошлогоднего соревнования.


Нам следует начать с запуска программы, чтобы увидеть, что она от нас хочет и на основании этого действовать. Когда мы загружаем программу, мы видим приглашение командной строки на ввод пароля. Если мы попытаемся угадать пароль, нам покажут сообщение, которое говорит, что мы ошиблись. Не слишком мудрёно — нам нужно просто узнать, что это за пароль.

Вывод программы с заданием:

Я собираюсь пропустить двоичный файл через rabin2 чтобы вытянуть всю базовую информацию. Я рассказывал как это сделать в моей первой статье, вводной инструкции по использованию radare2.

arch     x86
baddr    0x400000
binsz    3072
bintype  pe
bits     32
canary   false
retguard false
class    PE32
cmp.csum 0x00000e67
compiled Wed Jul  5 22:36:23 2017
crypto   false
endian   little
havecode true
hdr.csum 0x00000000
laddr    0x0
linenum  false
lsyms    false
machine  i386
maxopsz  16
minopsz  1
nx       false
os       windows
overlay  false
pcalign  0
pic      false
relocs   true
signed   false
sanitiz  false
static   false
stripped true
subsys   Windows CUI
va       true

Там ничего особо интересного, поэтому взглянем на строки, что там у нас:

\rÄ‼࠼
GetStdHandle
ReadFile
WriteFile
ExitProcess
KERNEL32.dll
\r&IE*
xD+l]^E
+DonV\t_EGs&\n\r
G1v3 m3 t3h fl4g:
G00d j0b!
N0t t00 h0t R we? 7ry 4ga1nz plzzz!

Здесь опять ничего чрезмерно интересного. Мы можем увидеть строку “G00d j0b!” которая, вероятно, показывается когда мы верно угадаем флаг. Оставшаяся информация похожа на много перемешенного мусора, поэтому вероятно пароль зашифрован. Мы будем делать отладку приложения, чтобы узнать, как соотносится наш пароль с их зашифрованным. Откройте это приложение в radare2 используя флаг -d, который говорит radare2, что мы собираемся запустить процесс отладки этого приложения.

radare2.exe -d IgniteMe.exe

Запуск и вывод в моём случае:

radare2.exe -d Z:\flare\IgniteMe.exe
Spawned new process with pid 10884, tid = 10528
= attach 10884 10528
bin.baddr 0x00400000
Using 0x400000
asm.bits 32
 -- Select your character: RBin Wizard, Master Anal Paladin, or Assembly Warrior
[0x7ff9e88b3670]>

Теперь мы проанализируем исполнимый файл используя команду ‘aaaa’. Затем мы перейдём в визуальный режим radare2 для отладки используя для этого команду ‘V!’. Этот режим позволяет нам видеть стек, регистры и другую информацию — всё из одного окна.

Программа задаёт нам вопрос:

Activate decompiler? It might take some time.(Y/n)

Перевод: «Активировать декомпилятор? Это может занять некоторое время». У меня при активированном декомпиляторе не запускается процесс отладки — ошибка «Fatal exception (access violation)», поэтому я выбираю «n» (то есть Нет).


Затем мы можем использовать команду ‘s entry0’ для перехода к главной функции исполнимого файла. Вы можете сделать это двумя способами. Выйти из визуального режима используя ‘qq’ и запустив команду в обычном режиме, или запустив команду в визуальном режиме используя ‘:s entry0’. Вы можете в radare2 запустить любую команду в визуальном режиме добавив перед ней ‘:’. После выполнения команды в визуальном режиме, нажмите ENTER ещё раз, для возврата в этот режим и перерисовки экрана. Если вы выполнили в командном режиме, то выполните V! для возврата в визуальный режим.


Как вы можете видеть — присутствует несколько окон между которыми можно переключаться клавишей TAB. Чтобы развернуть выделенное окно на весь экран, нажмите ENTER. Для возврата в обычный вид, нажмите ENTER ещё раз.

В entry0 мы можем видеть запрос программы на ввод пароля.

После того, как она выводит строку используя WriteFile, то затем она вызывает другую функцию. У Radare2 была ошибка при анализе этой функции, так как она должна называться ReadFile, и именно так программа захватывает наш ввод. Затем она принимает наш ввод и пропускает его через функцию в 0x401050. Мы можем назначить здесь точку остановки (breakpoint), для этого в режиме «V!» прокручивайте, пока эта строка не окажется вверху страницы, затем нажмите F2.

Затем мы запускаем программу, для этого дважды нажмите кнопку F9. Radare2 автоматически остановится, когда появится приглашение командной строки, в этот момент нам нужно вернуться в radare2 и вновь нажать F9. Затем нам нужно ввести нашу строку и нажать ENTER, выполнение программы остановиться в только что созданной нами точке остановки (breakpoint).

Чёрная консоль после первых двух нажатий F9:

После ещё одного нажатия F9 и ввода нашей строки в попытке угадать пароль:

В визуальном режиме нажмите клавишу s для пошаговой отладки. А S (большая s) используется для «перепрыгивания» - когда вызывается функция, если нажать S, то вместо входа в эту функцию будет выполнен переход сразу к её результатам, без прохода по шагам вызываемой функции.

Содержимое функции, в которую мы перешли:


Взгляните на неё, похоже на то, что она шифрует нашу строку и затем сравнивает её с str.IE. Мы можем пройти по шагам этой функции чтобы увидеть в точности КАК она шифрует переданную строку.

В начале я использую кнопку s для прохождения по программе по отдельным шагам, пока я не достигаю

call 0x401020

Мне было лень и что-то не хотелось проходить эту функцию по шагам, поэтому я перепрыгнул к концу её выполнения, для этого нажал S. Затем я посмотрел на правую сторону окна, чтобы увидеть, чему равно значение eax, поскольку обычно функции возвращают их результат в eax.

Как мы можем видеть, eax равно 2, что является длиной нашей строки. Следовательно, всё, что делает функция, это проверяет длину нашей строки. Давайте продвинемся чуть дальше и посмотрим, что делает следующая функция.

Я перенёсся в конец функции call section..text (0x401000) и она вернула шестнадцатеричное значение 0x00700004 и переместила al в [ebp-1]:

По сути, это просто помещает число 4 в [ebp-1], зачем это нужно мы увидим позже.

Затем мы видим, что длина нашей строки [ebp-0xc] перемещается в eax и запускается цикл, который проходит по каждому символу в строке. Пройдя немного вперёд через него мы заметим, что последняя буква нашей строки помещается в eax и значение [ebp-1] помещается в ecx. Затем между этими двумя значениями выполняется операция xor для начала процесса шифрования нашей строки.

Затем последняя буква нашего введённого текста помещается в [ebp-1] и цикл запускается снова.

Итак, похоже на то, что выполняется операция xor между каждой буквой строки и предыдущей буквой. Если предыдущая буква отсутствует, то тогда операция xor выполняется между символом и цифрой 4.

Итак, для нашей строки ‘hi’ сделана xor между ‘i’ и 4, а затем xor с ‘h’ и ‘i’. Поэтому наша зашифрованная строка стала 0x1 0x6d. Оглядев программу далее, мы можем видеть, что эта зашифрованная строка сравнивается посимвольно с такой строкой:

\r&IE*\x17xD+l]^E\x12/\x17+DonV\t_EGs&\n\r\x13\x17HB\x01@M\f\x02i

Некоторые из этих значений являются шестнадцатеричными величинами, а не буквальными символами строки. Так radare2 парсит данные — поскольку часть из этих символов является непечатными, относится к управляющим символам. Теперь мы знаем, что происходит, и нам не нужно больше продолжать отладку приложения — мы можем перейти к расшифровке строки, чтобы узнать, что там за флаг. Что хорошо в xor, так это то, что эту операцию можно использовать для кодирования и декодирования. Поэтому способом декодирования этой строки будет выполнение операции xor между последним символом и 4. Затем берётся следующее значение и полученное от предыдущей операции и между ними выполняется xor и так далее.

Для лучшего понимания процесса, рекомендуется посмотреть «ASCII и шестнадцатеричное представление строк. Побитовые операции со строками».

В PHP для выполнения этой процедуры можно воспользоваться функциями ord (возвращает номер символа для соответствующей кодировки, в данном случае номер символа в таблице ASCII) и chr (показывает символ по его десятичному номеру в таблице ASCII).

К примеру, для вывода первого символа:

echo chr(ord("i")^4);
m

Операции для остальных символов:

i^4 = m
0x02^m = o
\f^o = c
M^c = .
@^. = n
0x01^n = o
B^o = -
H^- = e
0x17^e = r
0x13^r = a
\r^a = l
\n^l = f
&^f = @
s^@ = 3
G^3 = t
E^t = 1
_^1 = n
\t^n = g
V^g = 1
n^1 = _
o^_ = 0
D^0 = t
+^t = _
0x17^_ = H
/^H = g
0x12^g = u
E^u = 0
^^0 = n
]^n = 3
l^3 = _
+^_ = t
D^t = 0
x^0 = H
0x17^H = _
*^_ = u
E^u = 0
I^0 = y
&^y = _
\r^_ = R

Итак, флаг получился R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com. Если мы введём его, мы увидим, что мы прошли вызов.

Это было очень базовое использование отладчика Radare2 в Windows. Лично я при отладке приложений предпочитаю использовать x64dbg, но это был интересный опыт изучения.

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

Ошибки работы Radare2 в Windows — решение проблем

Fatal exception (access violation) in thread

При запусти процесса отладки Radare2 в Windows я столкнулся с ошибкой:

(2940) Fatal exception (access violation) in thread 10556stem32\ntdll.dll) ntdll.dll
(2940) loading library at 0000000077A20000 (C:\Windows\SysWOW64\ntdll.dll) ntdll.dll
(2940) Fatal exception (access violation) in thread 10556

Процесс отладки в этот момент останавливался.

Чтобы избежать эту проблему, при переходе в визуальный режим на запрос системы (активировать ли декомпилятор?):

Activate decompiler? It might take some time.(Y/n)

Ответьте отрицательно, тогда описанная проблема должна исчезнуть.


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

2 комментария to Отладка приложения в Windows с Radare2

  1. Andrey:

    При добавлении в переменую PATH вместо ввода rabin2.exe возможен ввод просто rabin2. Тоже самое работает с  radare2.exe = r2, radare2. Пока только это проверил. Может кому пригодится. Мне по карайней мере так удобней))) Спасибо за цикл статей информативно!))

    • Alexey:

      Приветствую! Спасибо за добрые слова!

      А разве без добавления в PATH не работает запуск программ по имени файла без расширения? Я тоже этим пользуюсь, независимо от того, программа в PATH или нет.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *