Дизассемблируем все подряд с помощью 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 осуществляется как-то так:

yaourt -S radare2-cutter-git

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

Просмотр дизассемблированного кода:

Дизассемблированный код в Cutter

Тот же код, отображенный в виде графа:

Cutter: отображение кода в виде графа

Он же, но в виде псевдокода:

Cutter: отображение псевдокода

Если же вы предпочитаете работать с CLI, то можете сказать:

# по умолчанию файл открывается только на чтение:
r2 ~/path/to/binary
# для открытия на чтение и на запись скажите:
# r2 -w ~/path/to/binary

Как это примерно будет выглядеть:

Дизассемблированный код в Radare2

Команд у 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.

Метки: , , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.