Пакет программ radare2 это бесплатный и свободный тулчейн для упрощения некоторых низкоуровневых исследовательских задач, таких как криминалистика, реверс-инжиниринг ПО, написание эксплойтов, отладки, и т. п. В тулчейн радара входит набор библиотек (которые расширяются плагинами) и программ, которые могут использоваться для исследования бинарников, написанных почти на любом языке программирования.
Функциональные возможности radare2:
- Режимы: пакетный (batch), командной строки (commandline), визуально-интерактивный, панельный. - Встроенный web-сервер с поддержкой скриптов js и webui. - Ассемблирование и дизассемблирование большого списка CPU. - Работает на Windows и любом другом UNIX. - Анализирует и эмулирует код с ESIL. - Native-отладчик, GDB, WINDBG, QNX и FRIDA. - Навигация по ascii-art, графам управления потоком. - Возможность наложение патчей на бинарники, модификации кода или данных. - Поиск паттернов, magic headers, сигнатур функций. - Упрощенное расширение и модификация. - Командная строка, C API, скрипты с помощью r2pipe на любом языке.
[Установка]
Рекомендуемый способ установки - компиляция из исходников git [2]. Альтернативно можете взять последний релиз (выпускается каждые 6 недель) на Github (см. релизы также на https://radare.mikelloc.com/).
Установка выполняется следующим образом:
$ git clone https://github.com/radareorg/radare2
$ cd radare2 ; sys/install.sh
Radare2 может использоваться многими способами, от командной строки и шелл-скриптов до вызова индивидуальных инструментов:
$ rasm2 -a arm -b 32 -d `rasm2 -a arm -b 32 nop`
$ rabin2 -Ss /bin/ls # list symbols and sections
$ rahash2 -a md5 /bin/ls
$ rafind2 -x deadbeef bin
Все программы также доступны как команды изнутри r2:
$ r2 -
> pa nop
90
> pad 90
nop
Вот несколько общих команд, которые вы можете использовать в повседневной работе:
$ r2 /bin/ls
> aaa # анализировать все что можно
> is # список символов
> afl # список найденных функций
> pdf # дизассемблирование
> s < tab> # seek to address
> v # вход в визуальный панельный режим
Отладчик. Слой IO, выбранный URI файла, когда файл открывается в r2, может быть любым - локальным, remote r2 shell, полный диск, другой процесс в памяти, и т. д.
Для упрощения жизни флаг -d будет использовать dbg://uri, чтобы породить процесс или подключиться к процессу для чтения/записи его памяти, модификации регистров и инспекции потока выполнения кода. Это отладчик низкого уровня. Не волнуйтесь, разработчики не пытаются заменить gdb/lldb.
$ r2 -d gdb://127.0.0.1
> ds # step into
> dso # step over
> dr= # показать регистры столбцами
> dbt # show backtrace
> dsu entry0 # продолжить до точки входа
> dr rax=33 # поменять значение регистра
> pxr@rsp # инспекция стека
> drr # periscoped-значения регистра
Плагины. С помощью интегрированного менеджера пакетов вы можете легко устанавливать внешние плагины из разных источников. Самые интересные это native ghidra decompiler, r2dec decompiler и интеграция frida, но также могут быть и другие.
$ r2pm update
$ r2pm -i r2ghidra r2dec r2frida
Frida. Это популярный отладчик/трассировщик, также доступный внутри r2 после установки плагина r2frida. С его помощью вы можете присоединиться или запустить под отладкой (attach/spawn) локальную или удаленную программу через USB или TCP, и исследовать память процесса путем её чтения и записи.
Одно из основных достоинств использования r2frida вместо frida: несмотря на зависимость от Python по факту вы можете вводить короткие команды место ввода нескольких строк Javascript.
Основные возможности r2frida:
- Доступ к remote файловым системам. - Модификация дескрипторов файла. - Точки останова (breakpoints как в DWARF). - Load/Unload агент-скриптов как плагинов. - Символизация из локальных бинарников, скриптов или runtime-информации. - Поддержка macOS/iOS/Linux/Android/QNX/Windows.
$ r2 frida:///bin/ls
> :dc # продолжить выполнение
> :dd # список дескрипторов файлов
> :dm # показать карту памяти процесса
> :dmm # показать отображенные модули
> :dl foo.so # загрузить shlib
> :dt write # трассировка каждого вызова 'write'
> :isa read # найти, где находится символ read
> :ii # список импортов из текущего модуля
> :dxc exit 0 # вызов символа 'exit' с аргументом 0
[Документация]
Присоединяйтесь к каналам Telegram / IRC [3] и не стесняйтесь задавать вопросы, читайте документацию [4]. Но также имейте в виду, что в r2 есть встроенная документация (просто добавьте символ '?') или см. man-документацию и результат вывода r2 -h.
-- запустить radare2 без открытия какого-либо файла - то же самое, что 'r2 malloc://512' = прочитать файл из stdin (используйте -i и -c для запуска команд) -= выполнить команду !=! для удаленного запуска всех команд -0 печать \x00 после init и каждой команды -2 закрыть дескриптор файла stderr (подавляет warning-сообщения) -a [arch] установить asm.arch -A запустить команду 'aaa' для анализа всего ссылочного кода -b [bits] установить asm.bits -B [baddr] установить базовый адрес для бинарников PIE -c 'cmd..' выполнить radare-команду -C файл это host:port (алиас для -c+=http://%s/cmd/) -d отладка исполняемого файла, или запущенного процесса pid -D [backend] разрешить debug-режим (e cfg.debug=true) -e k=v вычислить переменную конфигурации -f block size = file size -F [binplug] принудительно использовать плагин rbin -h, -hh показать сообщение подсказки по командам, -hh для расширенной подсказки -H ([var]) показать переменную -i [file] запустить файл скрипта -I [file] запустить файл скрипта перед открытием файла -j использовать json для -v, -L и возможно для других целей -k [OS/kern] установить asm.os (linux, macos, w32, netbsd, ...) -l [lib] загрузить файл плагина -L, -LL список поддерживаемых IO плагинов (-LL список core плагинов) -m [addr] отобразить файл по указанному адресу (loadaddr) -M не выполнять восстановление (demangle) оригинальных символов -n, -nn не загружать RBin информацию (-nn загружать только bin структуры) -N не загружать настройки пользователя и скрипты -NN не загрузить никакие скрипты или плагины -q quiet-режим (тихий режим, без приглашения ввода команд) и выход после -i -qq выход после выполнения всех -c и -i -Q quiet-режим (без приглашения ввода) и более быстрый выход (quickLeak=true) -p [prj] использовать проект, список если не указаны аргументы, загрузка если нет файла -P [file] применить rapatch файл и выход -r [rarun2] указывает профиль rarun2 для загрузки (то же самое что и -e dbg.profile=X) -R [rr2rule] указывает пользовательскую rarun2 директиву -s [addr] начальный seek -S запуск r2 в режиме песочницы (sandbox mode) -t загрузка rabin2 info в поток -u установка bin.filter=false чтобы получить raw-имена sym/sec/cls -v, -V показать версию radare2 (-V покажет lib-версии) -w открыть файл в режиме записи -x открыть без exec-флага (asm.emu не будет работать), см. io.exec -X то же самое, что и -e bin.usextr=false (полезно для dyldcache) -z, -zz не загружать строки, и не загружать их даже в raw
Вы также можете использовать HUD-режим для интерактивного просмотра всех внутренних команд r2 с помощью команды (выход из этого режима через q+Enter):