Дизассемблируем все подряд с помощью Radare2 и Cutter
Вы можете помнить заметку про интерактивный дизассемблер 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 осуществляется как-то так:
yaourt -S radare2-cutter-git
Начать работать проще всего с 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’ы для бинарных файлов:
$ radiff2 before.bin after.bin
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:
$ rasm2 'mov eax, ebx;pop ebp;nop'
89d85d90
$ rasm2 -d 89d85d90
mov eax, ebx
pop ebp
nop
Для RISC-V пока есть только дизассемблер:
# флаг -EB включает вывод в big endian
$ 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
Если вы подзабыли, что делает та или иная инструкция, скажите:
$ rasm2 -a riscv -w lui
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.



