Вы можете помнить заметку про интерактивный дизассемблер Hopper , в рамках которой мы познакомились с недорогой (99$) альтернативой IDA Pro. А если я скажу вам, что существует не просто недорогая, а полностью бесплатная и открытая альтернатива, которая по многим показателям превосходит Hopper, а по некоторым и саму IDA Pro? Лет 10 назад мне было бы трудно в это поверить, но сегодня существование такого решения — это объективная действительность. Решение называется Radare2 .
Что такое Radare2?
Radare2 (он же R2) представляет собой фреймворк для анализа и обратного инженеринга бинарных файлов, в том числе исполняемых. Фреймворк придерживается философии UNIX, и потому состоит из относительно небольших CLI-утилит, каждая из которых решает свою задачу. Для снижения порога вхождения предусмотрена GUI-обертка, написанная на Qt, под названием Cutter. По интерфейсу он напоминает IDA Pro и Hopper.
Примечание: В этом контексте может быть не лишено смысла ознакомиться с постом Шпаргалка по основным инструкциям ассемблера x86/x64 , если вдруг вы его пропустили.
Некоторые ключевые возможности и отличительные свойства фреймворка:
- Само собой разумеется, есть функции интерактивного дизассемблера. В том числе, можно переименовывать переменные и процедуры, переходить вперед и назад по ссылкам, вставлять комментарии к коду. Также есть отображение кода в виде графа и псевдокода на C-подобном языке;
- Во фреймворк встроен мощный отладчик. Помимо прочего, этот отладчик позволяет подключаться к уже запущенному процессу, поддерживает удаленную отладку, а также reverse debugging, аналогично GDB и RR ;
- Бинарные файлы можно редактировать;
- Поддерживается множество ISA, в том числе x86/x64, ARM, AVR, 8051, PIC, MIPS, Xtensa (это которая в ESP8266 и ESP32), JVM и даже RISC-V . Интересно, что ассемблер микроконтроллеров STM8 на момент написания этих строк не поддерживался;
- Фреймворк позволяет легко добавлять поддержку новых ассемблеров и дизассемблеров, парсеры различных форматов файлов, анализаторы, и так далее;
- Под Radare2 можно писать скрипты на Python . Еще с фреймворком могут интегрироваться программы, написанные на такой эзотерике, как Go , Vala , Rust , Haskell , Erlang , а также на других языках;
- Поддерживается еще множество функций, таких, как поиск по сигнатурам, поиск строк, вычисление хэшей, преобразование чисел в разные представления, вычисление бинарных diff’ов, вывод краткой подсказки по ассемблерным инструкциям, вывод информации о файлах аналогично readelf, и так далее;
- Имеется адекватная документация;
- В отличие от Hopper, Radare2 поддерживает не только Linux и MacOS, но и Windows. Удивительно, но Radare2 работает даже на iOS и Android;
- Проект является открытым (разные компоненты имеют разные лицензии, в основном GPL и BSD) и распространяется бесплатно;
Давайте же попробуем выяснить, как пользоваться всем этим хозяйством!
Установка и использование
Под Arch Linux установка Radare2 и Cutter осуществляется как-то так:
Начать работать проще всего с Cutter. Программа имеет интуитивно понятный интерфейс™, поэтому у вас не должно возникнуть с ним сложностей. Ниже приведено несколько скриншотов, из которых все являются кликабельными.
Просмотр дизассемблированного кода:
Тот же код, отображенный в виде графа:
Он же, но в виде псевдокода:
Если же вы предпочитаете работать с CLI, то можете сказать:
r2 ~ / path / to / binary
# для открытия на чтение и на запись скажите:
# r2 -w ~/path/to/binary
Как это примерно будет выглядеть:
Команд у Radare2 очень много. Вот некоторые из них:
-
?
— подсказка; -
aaa
— выполнить анализ файла; -
i
— информация о файле; -
ie
— узнать, где находится entry point; -
ii
— список импортов; -
iz
— список строк в секции даннях; -
izz
— список вообще всех строк в файле; -
is
— список символов; -
is~FUNC
— то же самое, но с grep по строке «FUNC»; -
is~[6]
— выводить только шестую колонку, то есть, имена символов; -
is~main[6]
— можно совмещать фильтрацию с выбором колонки; -
b 0x40
— изменить размер блока по умолчанию; -
pd
— дизассемблировать блок по текущему смещению; -
pdf
— дизассемблировать текущую процедуру; -
pxf
— hexdump текущей процедуры; -
pdc
— вывод процедуры в виде псевдокода; -
px @ <addr>
— hexdump по определенному адресу или символу; -
s <addr>
— перейти к адресу или символу; -
sf
— перейти к следующей функции; -
s-
— отменить последний переход; -
s+1
— перейти на один байт вперед; -
s++
— перейти на размер блока вперед; -
s--
— перейти на размер блока назад; -
V
— визуальный режим (далееhjkl
или:команда
); -
VV @ main
— отображение процедуры в виде графа; -
ag main > 1.dot
— экспорт графа процедуры в формате Graphviz ; -
afl
— список процедур; -
afn <name>
— переименовать процедуру; -
afvn <from> <to>
— переименовать переменную; -
CC <comment>
— добавить комментарий; -
CC- <addr>
— удалить комментарий; -
CC
— список комментариев; -
wx 4142434445
— записать данные в hex; -
wz str
— записать ASCII-строку; -
"wa nop;nop;nop"
— записать ассемблерный код; -
Ps <file>
— сохранить проект; -
Po <file>
— открыть проект; -
q
— выйти из Radare2;
И это мы еще отладчик не трогали! Заинтересованные читатели могут найти туториал по работе с ним здесь .
Об утилитах
Из небольших утилит, входящих в Radare2, мне особенно понравились radiff2 и rasm2. Первая позволяет считать diff’ы для бинарных файлов:
File size differs 135100 vs 118588
Buffer truncated to 118588 byte(s) (16512 not compared)
0x00018ef0 00 => 62 0x00018ef0
0x00018ef2 0000 => 7f72 0x00018ef2
0x00018ef5 0000 => 8011 0x00018ef5
Эта утилита сильно помогла мне при исправлении бага в самопальном алгоритме сжатия для конфигураций FPGA, который я упоминал в посте Изучаем BlackIce II, отладочную плату с STM32 и ICE40 .
Что же касается rasm2, она представляет собой простой консольный ассемблер и дизассемблер. Например, так можно посмотреть поддерживаемые ISA:
# a — ассемблер
# d — дизассемблер
# A — анализатор
# e — эмуляция
$ rasm2 -L
_dAe 8 16 6502 LGPL3 6502/NES/C64/Tamagotchi/…
_dAe 8 8051 PD 8051 Intel CPU
_dA_ 16 32 arc GPL3 Argonaut RISC Core
a___ 16 32 64 arm.as LGPL3 as ARM Assembler
…
Проверяем ассемблер и дизассемблер для x86:
89d85d90
$ rasm2 -d 89d85d90
mov eax, ebx
pop ebp
nop
Для RISC-V пока есть только дизассемблер:
$ riscv64-unknown-elf-objdump -EB -d progmem
…
00000130 <main>:
130: b7070100 lui a5,0x10
134: 1307a00a li a4,170
138: b7366e01 lui a3,0x16e3
…
$ rasm2 -a riscv -d b70701001307a00ab7366e01
lui a5, 0x10
li a4, 170
lui a3, 0x16e3
Если вы подзабыли, что делает та или иная инструкция, скажите:
load upper immediate
Из прочих утилит заслуживают внимания r2pm (менеджер пакетов для R2), rabin2 (получение информации об исполняемом файле), rax2 (конвертер чисел из одного формата в другой), rafind2 (поиск строк и сигнатур) и rahash2 (вычисление хэшей).
Заключение
Рассказать обо всех возможностях Radare2 в рамках одного поста не представляется возможным. В качестве источников дополнительной информации я бы рекомендовал следующие:
- Официальный сайт проекта . Помимо прочего, на сайте вы найдете ссылки на блог, Twitter-аккаунт проекта, а также каналы в Telegram и IRC. В блоге есть хорошие посты с примерами реального использования R2;
- Есть две книги: Radare2 Explorations и Radare2 Book . Первая покороче и хорошо подходит для быстрого введения, вторая поподробнее. Обе книги распространяются бесплатно;
- Была нагуглена неплохая шпаргалка Radare2 Cheetsheet [PDF] . Можно распечатать и повесить на стену;
- На YouTube доступны видео с конференций r2con 2016 и r2con 2017 . Если вы читаете этот текст в далеком будущем, видео за другие годы наверняка также будут доступы;
- Еще хорошая статья Вглядываемся в Radare2 была найдена в блоге crafting.be. Помимо прочего, из нее вы узнаете про наличие у Radare2 веб-интерфейса;
- Огромный список слайдов, видео, туториалов и всякого такого есть на GitHub’е, в репозитории awesome-radare2 ;
Вокруг Radare2 сложилось очень активное и дружелюбное сообщество. При этом, как вы можете видеть по тому же выводу rasm2 -L
, фреймворку еще есть куда расти. Все это делает Radare2 крайне интересным открытым проектом в плане возможностей для самореализации .
Дополнение: Вас также может заинтересовать статья Реверс-инжиниринг роутера на примере GL.iNet GL-AR750 .