R0 CREW

Знакомство с Radare 2 — Часть первая: простой крекми

Оригинал: megabeets.net

Пролог

Я очень много игрался с radare2 в прошлом году, с тех пор я начал участвовать в CTF, и стал глубоко погружаться в квесты по реверсу и эксплуатации уязвимостей. Я нашел radare2 очень полезным во многих СTF-тасках, мои решения благодаря нему стали намного короче. Иногда это мой незаменимый инструмент для решений тасков по исследованию зловредов таких как “сonfiguration retrieval”. Печально, но я уверен, что лишь немного людей знакомы с radare2. Возможно, это вызвано тем, что они боятся выйти из зоны комфорта (IDA Pro, OllyDBG, gdb) или попросту не слышали про это. Так или иначе, я в правда верю, что вы добавите radare2 в свой инструментарий.

Потому что я реально очень очень верю в этот проект и хочу, чтобы все больше и больше исследователей были с ним знакомы, использовали его и, надеюсь, делали вклад в его развитие. Я решил сделать серию статей и примеров использования r2. Эти статьи нацелены научить вас основам radare2, его фишкам и возможностям, я объясню вам намного больше, чем вы должны знать для решения любого таска.

Добро пожаловать в IDA 10.0 (см. radare2/doc/fortunes.fun)

radare2

radare2 — опенсурсный фреймворк для реверсинга и анализа бинарников, реализованный в виде богатого консольного интерфейса для дизассемблирования, анализа данных, патчинга бинарников, сравнанения данных, поиска, перестановки, визуалиции и другое. У него есть возможность скриптинга, а также он работает на всех платформах (GNU/Linux, .Windows *BSD, iOS, OSX, Solaris…) и поддерживает тонну архитектур и форматов файлов. Но может быть важнее всех его фич идеология, на котором он стоит, radare2 абсолютно свободен.

Этот фреймворк состоит из набора утилит, который могут быть использованы или вместе из r2, или же отдельно. Мы познакомимся с такими утилитами как rahash2, rabin2, ragg2. Вместе они создают один из самых мощных инструментов в области статического и динамического анализа, редактирования hex и эксплуатации (я углублюсь в последующих статьях об этом).

Это важно отметить, что кривая обучения r2 попросту крутая, хотя r2 имеет оконный и веб-интерфейс, ни одного из них недостаточно, чтобы конкурировать с графическим интерфейсом или удобством IDA, имхо. Интерфейс командной строки, включая его визуальный режим, по-прежнему является ядром radare2, и местом где находится вся его мощь. Из-за его сложности я постараюсь объяснить все как можно яснее и проще.

Это более или менее как кривая обучения r2 работает

Перед тем, как мы начнем, вы можете ознакомиться с “Unfair comparison between r2, IDA Pro and Hopper”(Беспристрастное сравнение r2, IDA, Hopper), для того чтобы понимать с чем мы имеем дело.

Getting radare2

Установка

Разработка radare2 ведется достаточно быстро, проект улучшается каждый день, так что очень рекомендуется использовать текущую версию с гита вместо стабильной версии. Иногда стабильная версия менее стабильна, чем текущая версия в гите.

$ git clone [url]https://github.com/radare/radare2.git[/url]
$ cd radare2
$ ./sys/install.sh

Если вы не хотите устанавливать гит версию или хотите бинарники для других систем (Windows, OS X, iOS, etc), зайдите на страницу загрузки с сайта radare2.

Обновление

Как я говорил ранее, очень рекомендуется всегда использовать самую свежую версию r2 из репозитория. Все что вам нужно, чтобы обновить вашу версию r2 из гита, это просто выполнить следующую команду:

$ ./sys/install.sh

И у вас будет свежая версия из гита. Я обычно обновляю свою версию radare2 утром, в то время как смотрю видосики с котиками.

Деинсталляция

Я не могу придумать причину, зачем вам удалять radare2 так рано в этой статье, но если вы хотите это сделать, вам всего лишь надо выполнить следующее:

$ make uninstall
$ make purge

Getting Started

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

Теперь когда radare2 установлен на вашей системе, и вы загрузили бинарник, мы готовы начать исследовать основы использования radare2. Я буду работать на Remnux, но большинство команд и объяснений (если не все они) будут теми же самыми, что и для Windows и остальных систем.

Аргументы командной строки

Как и в большинстве консольных утилит лучший способ выяснить список доступных аргументов – выполнить программу с флагом -h.

$ r2 -h

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

Информация о бинарнике

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

Мы вызываем rabin2 с флагом -I, который выводит информацию о бинарнике такую как операционная система, язык, порядок байтов, архитектура, mitigations (canary, pic, nx) и другое.

rabin2 -I megabeets_0x1

Как вы четко видите, наш бинарник - 32 битный ELF файл, с включенной дебаг информацией, динамически слинкован. У его нет никаких доступных техник митингации, полезная информация об этом будет в следующих статьях, когда мы научимся эксплоитить с помощью radare2.

Давайте теперь запустим программу и посмотрим, что она может.

$ ./megabeets_0x1
$ ./megabeets_0x1 abcdef

В первый раз как мы запускаем программу, мы получаем от нее сообщение, сообщающее “Не, неверный аргумент”. Предположим, что нам необходимо воспользоваться аргументом “abcdef” для программы. Мы ошиблись снова. Очевидно нам нужен некоторый пароль, чтобы решить эту крекми.

Давайте исследуем эту программу, используя radare2:

$ r2 ./megabeets_0x1

Мы заспавнили radare2 консоль, и она автоматически нас приветствует с одним из ее приколов. Некоторые из них очень смешны, другие очень полезны, вы можете использнить команду fo, чтобы r2 напечатал вам еще одну. Теперь консоль r2 ждет ваших команд и показывает адрес, где вы сейчас находитесь (0x08048370). По-умолчанию вы автоматически будете на адресе точки входа. Давайте проверим так ли это:

[0x08048370]> ie

Мы использовали ie команду, которая печатает энтрипоинты бинарника. Команды r2 — последовательность значимых букв. В данном примере ie расшифровывается как info>>entrypoint. Таким образом команды очень легко запомнить, когда вы знакомы с возможностями radare2. Но вам не нужно запоминать все команды — достаточно просто добавить ? после (почти) всех буквы, чтобы получить информацию о команде и ее субкомандах.

[0x08048370]> i?

Команда i нацелена на получение информации из открытого файла, это тот же rabin2 (упомянутый ранее), реализованный в консоле radare2.

Анализ

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

Очевидно анализ все еще можно выполнить и r2 имеет много типов функций анализа. Как я заметил раньше, мы можем исследовать функции анализа, добавляя ? к команде a.

[0x08048370]> a?

Я обычно начинаю работу, исполняя команду aa (analyse all). Имя данной команды может ввести в заблуждение, поскольку существует множество еще возможностей для анализа (проверьте команду aa?, но этого достаточно для большинства бинарников, которые я рассматривал. В этот раз мы начнем нашу работу прям с команды aaa, чтобы все сделать проще в связи с маленьким размером файла. Вы также можете запускать radare 2 с флагом -A, чтобы анализировать бинарник сразу же при запуске, используя aaa команду (например, r2 -A megabeets_0x1).

[0x08048370]> aaa

Флаги

После завершения анализа radare2 ассоциирует имена с интересными смещениями в файле такими как секции, функции, символы, строки, etc. Такие имена называются флагами. Флаги могут быть сгруппированы в пространства флагов.Пространство флагов — пространство для флагов со схожими характеристиками или типами. Список пространств флагов можно вывести с помощью команды ‘fs’.

[0x08048370]> fs

Мы можем выбрать пространство флагов, используя команду 'fs ’ и далее вывести флаги, содержащиеся в пространстве, используя команду ‘f’. Чтобы выполнить несколько команд в одной строке, мы можем использовать точку с запятой (т.е. ‘cmd1; cmd2; cmd3;…)…

[0x08048370]> fs imports; f

Как мы можем заметить, radare2 пометил импорты, используемые бинарником, мы можем видеть хорошо знакомые strcmp, strcpy, puts, etc вместе с их соответствующими адресами. Мы также можем посмотреть пространство строк:

[0x08048370]> fs strings; f

Строки

Мы видим, что r2 пометил некоторые смещения как строки, задал некоторый тип названий переменных. Давайте теперь посмотрим на сами строки. Есть множество способов сделать это, и вы должны выбрать способ, который будет отвечать вашей цели наиболее всего.

iz - Посмотреть список строк в data секции.
izz - Найти строки во всем бинарнике

[0x08048370]> iz

Мы уже знаем большинство этих строк, мы их видели, когда запускали наш бинарник, помните? Мы не видели строки “Success”, хотя это наше ‘good boy’ сообщение. Теперь когда у нас есть строки, давайте посмотрим, где они используются в программе.

[0x08048370]> axt @@ str.*

Эта команда раскрывает нам одну из фич radare2. Команда ‘axt’ используется, чтобы “найти данные\код, ссылающиеся на этот адрес” (см. ‘ax?’). А ‘@@’ это как символ форич итератора, используемый чтобы повторять команду над списком смещений (см. ‘@@?’), и ‘str.*’ - это регулярное выражение, означающее для всех флагов, начинающихся со ‘str’. Эта комбинация помогает мне не только получить список флагов типа string, но и также получить список имен функций, где это используются и саму указанную инструкцию. Не забудьте выбрать пространство флагов типа string (по-умолчанию используется ‘fs *’) перед этим.

Поиск

Как я упоминал ранее, все это время мы находились на этрипоинте программы, сейчас пора двигаться далее. Строки, которые мы нашли, все ссылаются на ‘main’. Для того, чтобы перейти из смещения в смещение, мы должны воспользоваться командой ‘seek’, представляемой ‘s’ в r2 консоли. Как вы уже знаете, добавляя знаков вопрос к (большинству) всем командам – ответ на все ваши проблемы.

[0x08048370]> s?

По-простому команда ‘seek’ позволяет использовать адрес или математическое выражение в качестве аргумента для поиска. Выражение может быть математической операцией, флагом или же операциями доступа к памяти. Мы хотим найти функцию ‘main’, мы можем сделать это, выполнив команду ‘s main’, но давайте посмотрим сначала, какие другие функции radare2 выделил для нас, используя команду afl (Analyze Functions List).

[0x08048370]> afl

Прелестно! Здесь импорты, которые мы были раньше, некоторые .ctors, энтропоинты, libc, main и две интересные функции, названные ‘sym.beet’ and ‘sym.rot13;’.

Дизассемблирование

main функция

Пришла пора посмотреть немного дизассемблированного кода (ура!). Мы должны для начала найти функцию, используя ‘s main’ и затем дизассемблировать ее, используя ‘pdf’ (Print Disassemble Function). Обратите внимание, как адрес в консоли поменяется на адрес main.

[0x08048370]> s main
[0x080485f5]> pdf

Из дизассемблированного листинга, мы можем быстро сгенерировать псевдокод:

if (argc > 1 && beet(argv[1]) == true)
# i.e - if any argument passed to the program AND the result of beet, given the passed argument, is true
# argc is the number of arguments passed to the program
# argc will be at least 1 becuase the first argument is the program name
# argv is the array of parameters passed to the program
{
    print "success"
}
else
{
     print "fail"
}
exit

Псевдографический и режим графа

radare2 экипирован очень мощным и эффективным набором псевдографических режимов. Псевдографический режим более дружелюбный и позволяет использовать реверсинг в r2 на абсолютно другом уровне. Команда ‘V’ откроет вам окно псевдографического режима. Используйте ‘p/P’ команды для переключения между псевдографическими режимами. На самом верху экрана вы можете увидеть команду, которая сейчас используется для отображения.

Простейшие команды псевдографического интерфейса

Передвижение

Вы можете передвигаться вверх и вниз, используя кнопки ‘k’ и ‘j’ соответственно. Нажимая Enter, где бы ни было на джампе или при вызове функции, вы можете прыгнуть на адрес назначения. Рядом с каждым прыжком или вызовом функции есть число в квадратных скобках, нажимая цифру на своей клавиатуре, вы попадете на нужную адрес/функцию.

Помощь

Как и всегда в radare, нажимая ? вы переместитесь на экран помощи, где вы можете исследовать команды псевдографического режима.

Перекрестные ссылки

Используйте x/X, чтобы отобразить ссылки на/из функции соответственно. Используйте номера, чтобы прыгнуть на адрес ссылки.
radare2 команды
Используйте :command для того, чтобы выполнить r2 внутри псевдографического режима.

Комментирование

Вы можете добавить или удалить коммент, используя команду ‘;comment’ для добавления, ‘;-’ для удаления комментария.

Пометки

m может быть использована для маркировки определенных смещений с ключом на ваш выбор. Нажмите на клавиатуре кнопку ключа, чтобы перейти на смещение.

Выход

Нажмите q для того, чтобы вернуться в r2 консоль.

Режим графов

Как и в простейших дизассемблерах, в radare2 есть свой режим графа. Вы можете получить доступ к ним через консоль, запустив команду VV, передвигаться по графу влево/вниз/вверх/вправо можно используя h/j/k/l, а чтобы прыгнуть на функцию используйте кнопку g и ключ показанный рядом с вызываемым адресом (т.е. gd).

Используйте ?, чтобы вывести все команды and будьте уверены не пропустить R команду (прим. переводчика: это самое важное, правда!).

Дизассемблируем ‘beet’

После короткого прекращения дизассемблирования, давайте вернемся к этому и исследуем функцию beet. Как мы видели ранее, наш бинарник проверяет результат функции beet, которая вызывается с аргументом, который мы передаем программе. Мы можем вывести beet, используя несколько способом, вот некоторые из них:

  • Искать beet в r2 консоли и выводить функцию, используя s sym.beet (sym.beet это флаг для beet функции. Вы можете вывести флаги sym, запустив команду f sym.) и далее выполнив pdf (print disassembled function).
  • Вывести beet из r2 консоли без поиска, используя pdf @sym.beet. Знак @ используется как временный поиск, т.е. “вывести функцию со смещением sym.beet”.
  • Прыгнуть в функцию beet из псевдографического интерфейса, используя кнопку 3 в main (номер рядом с вызываемой функцией)
  • Прыгнуть в beet из Режима Графов, используя сочетание клавиш типа gd (где d - следующая буква рядом с вызываемой функцией из списка графов)

Вот как функция beet выглядит в псевдо графическом режиме:

Мы можем видеть, что полученный аргумент копируется в буфер. Буфер расположен в регистре ebp – local_88h. А ‘local_88h’ это 0x88, что есть 136 в десятичной системе исчисления. Мы можем увидеть это, запустив команду ? 0x88. Чтобы выполнить команду внутри псевдографического интерфейса, используйте ‘:’, а затем пишите свою команду.

:> ? 0x88

Таким образом, 128 байт аллоцированы для буфера в стэке, следующие 4 байта будут использоваться для того, чтобы сохранить ссылку на ebp предыдущего стек фрейма, а еще следующие 4 байта будут адресом возврата, итого это суммируется до 136.
После того как в буфер попадает наш аргумент, он будет сравнен с результатом функции, названной sym.rot13. Rot13 – известный алгоритм шифротекста путем подстановки, используемый во многих CTF и крекми. Функций вызывается с девяти шестнадцати разрядным значениями, которые radare отказывается распознавать как строку (прим. переводчика: теперь распознает!). Мы можем сделать это вручную, используя команду ahi s прямо на эти адреса.

:> ahi s @@=0x080485a3 0x080485ad 0x080485b7

ahi s используется, чтобы выставить специфические смещения как строки (см. ahi?), @@ это итератор (см. @@?) и адреса используются прямо из функции sym.beet, которые radare2 не распознал как строки. После выполнения команды, интерфейс обновится (если не обновился, используйте кнопку r) и будет выглядеть так:

Великолепно! Похоже за строкой пряталось слово “Megabeets” (запушенное в обратном порядке в связи с порядком байтов).

Бинарник осуществляет rot13 над строкой “Megabeets” и затем сравнивает результат с аргументом, который мы отправили в программу, используя для этого strcmp. К счастью, нам не нужно напрягаться, потому что r2 фреймворк уже включает rot13 шифр в его rahash2 утилите.

:> !rahash2 -E rot -S s:13 -s ‘Megabeets\n’

rahash2 осуществила rot13(“Megabeets”) и в результате вывела “Zrtnorrgf”. Использов символ ‘!’, мы можем выполнять команды в консоли системы (прим. переводчика: можно и не писать !, чтобы исполнить команду в командной оболочке). Мы можем заметить, что строка “Zrtnorrgf” сравнивается с нашей вводимой строкой. Давайте откроем бинарник в режиме дебага со строкой “Zrtnorrgf” в качестве аргумента, использовав команду odd (см. ood?) и посмотрим, что будет.

[0xf7749be9]> ood?
[0xf7749be9]> ood Zrtnorrgf

Вууху! Мы получил сообщение об успехе и решили крекми. После получения успешного сообщения мы можем наконец сказать, что наш бинарник делает: он берет первый аргумент, который мы вводим, и сравнивает его с rot13(“Megabeets”), что является “Zrtnorrgf”.

Вы можете увидеть полный исходный код крекми тут.

Эпилог

Первая часть нашего приключения с radare2 подходит к концу. Мы изучили лишь ореховую скорлупу radare2 и исследовали лишь основы основ. В следующих частях мы узнаем больше о возможностях radare2, включая скриптинг, исследование малвари и эксплуатации. Я боюсь, что сначала будет сложно понять всю мощь radare2 или почему вы должны оставить некоторые из своих старых привычек и начать пользоваться radare2, но я обещаю, что имея radare2 в своем инструментарии – это очень умный шаг не важно являетесь ли вы реверс инженером, игроком CTF или просто энтузиастом в области безопасности.

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

Пожалуйста, оставляйте комментарии или сообщения приватно, если нечто неверно, неаккуратно, требует дополнительного разъяснения, или вы попросту этого не поняли. Не стесняйтесь делиться своими мыслями со мной.

Знакомство с Radare 2 -- часть вторая: эксплуатация
© Translated by Cynically special for r0 Crew
1 Like

Вторая часть опубликована: https://forum.reverse4you.org/t/1141