Дизассемблируем все подряд с помощью Radare2 и Cutter
21 мая 2018
Вы можете помнить заметку про интерактивный дизассемблер 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.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.