← На главную

Дизассемблируем все подряд с помощью 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. Программа имеет интуитивно понятный интерфейс™, поэтому у вас не должно возникнуть с ним сложностей. Ниже приведено несколько скриншотов, из которых все являются кликабельными.

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

Дизассемблированный код в 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.