Содержание статьи
В статье «Отладка программ без исходников. Анализируем двоичные файлы в Linux штатными средствами» мы рассмотрели базовые средства дизассемблирования и отладки приложений в Unix-подобных операционных системах, настолько старых, что ими пользовались еще динозавры. С другой стороны, уже в XXI веке были созданы альтернативные инструменты, благодаря своему удобству и мощи завоевавшие любовь трудящихся на ниве информационной (без)опасности специалистов.
Radare2
Как известно, Radare2 представляет собой глобально измененный форк первого Radare. В соответствии с законами мира Unix это набор узкоспециализированных утилит командной строки. Их можно применять как порознь, так и вместе: одна утилита использует результаты работы другой.
В набор входит более десятка утилит. Вот некоторые из них:
- Radare2 — собственно главная тулза, она способна открывать большое количество разных источников ввода‑вывода подобно обычным файлам: диски, сетевые соединения, драйверы, процессы под отладкой. Позволяет при помощи командной строки перемещаться по файлу и заниматься дизассемблированием, поиском, анализом, изменением и сравнением данных с возможностью визуализации. Любой процесс поддается скриптингу на многих языках, среди которых JavaScript, Ruby, Python и Lua.
- Rax2 — анализатор выражений. Умеет делать базовые преобразования между разными форматами: строками, значениями с плавающей запятой, шестнадцатеричными числами и прочими. Также поддерживает изменение порядка следования байтов.
-
Rafind2 — позволяет воспользоваться библиотекой
r_search
для поиска строк или байтов по маске. - Rabin2 — показывает всю информацию о двоичном файле: сведения о секциях, заголовках, импортированных данных и прочее. Понимает много форматов исполняемых файлов: PE, ELF, Mach-O, Java и другие. С помощью плагинов этот список можно расширить, после чего Rabin2 будет отображать символы импорта и экспорта, библиотечные зависимости, строки, адреса точек входа и тип архитектуры.
- Rarun2 — позволяет настроить среду для выполнения или отладки приложений. Позволяет менять настройки окружения, не затрагивая работу ОС. Особенно часто используется для переопределения потока вывода отлаживаемой с помощью Radare2 программы.
- Rasm2 — встроенный ассемблер/дизассемблер. Первоначально инструмент был разработан для внесения изменений в бинарные файлы. Его основная функция — получить байты, соответствующие заданному опкоду машинной инструкции. Rasm2 поддерживает плагины, что позволяет ему работать с файлами для разных архитектур.
- Radiff2 — тулза для сравнения двоичных файлов, подобно тому, как это делает diff с текстовыми файлами. Radiff2 использует разные алгоритмы для поиска и сравнения содержимого файлов.
- Ragg2 — компилирует программы, написанные на собственном языке высокого уровня, в крошечные бинарники для архитектур x86, x86-64 и ARM. Позволяет организовать базовый блок для создания перемещаемых фрагментов кода, которые будут использоваться для внедрения в целевые процессы при эксплуатации. Хотя по умолчанию Ragg2 компилирует свой собственный язык Ragg2, также можно скомпилировать код на языке C, используя шелл‑коды GCC или Clang.
- Rahash2 — c помощью большого числа алгоритмов подсчитывает контрольную сумму любых файлов, дисков или строк. Тулза также способна кодировать и декодировать данные, используя простые операции, такие как Base64, XOR и прочие.
- Rodeco — написанный на Rust декомпилятор с ассемблера, получаемого от Rasm2, на псевдо-C. К сожалению, до сих пор нежизнеспособен: результаты его работы крайне скромные. Поэтому утилита не включена в стандартную поставку фреймворка.
Так как Radare2 — Unix-ориентированный фреймворк, все утилиты в базовом варианте исполняются в командной строке. Однако с Radare2 можно работать не только в консольной среде: к услугам хакера есть несколько графических оболочек, объединяющих все инструменты фреймворка в мощную интерактивную среду. Среди них особую популярность завоевали iaito и Сutter. Они очень похожи, поскольку второй — форк первого.
Инструменты, входящие в Radare2, можно использовать в самых разных ОС и исследовать код для разных процессорных архитектур. Поддерживаются x86-64, ARM, MIPS, PowerPC, SPARC, Z80, MOS 6502 и байт‑код разных виртуальных машин. Анализировать можно PE32, PE32+, ELF, ROM-файлы игровых приставок и многое другое.
Хотя сами утилиты Radare2 где только не работают, интерактивные среды поддерживаются лишь в основных десктопных ОС. Однако даже консольные утилиты Radare2 удобны в работе, если ты умеешь с ними обращаться. Также управлять Radare2 можно из веб‑оболочки.
Изучив основные сведения, переходим к практике, а точнее — к установке.
Установка
В отличие от прошлой статьи, где я использовал Ubuntu, организовывать эксперименты сегодня я буду в Debian Linux.
Перед установкой Radare2 в Debian мне потребовалось установить gnu
, по умолчанию его в дистрибутиве не было. Лучше сразу установить build-essential
:
sudo apt-get install build-essential
Хотя многие дистрибутивы Linux содержат готовые к инсталляции пакеты Radare2, версия из менеджера пакетов может быть не самой новой, поэтому можешь скачать последнюю версию с GitHub (заметим, что и обновлять в таком случае дальше придется вручную):
git clone https://github.com/radareorg/radare2.git
Запустим установку:
cd radare2
sudo sys/install.sh
Внутри подкаталога binr
находятся подпапки со всеми перечисленными выше утилитами.
Заодно установим vim, если его нет в системе:
sudo apt install vim
Хотя, если предпочитаешь nano или другой редактор, ты волен ставить, что тебе больше нравится.
Объект анализа
Итак, представим, что наш Linux находится в далекой‑предалекой галактике и нам, героям, нужно взломать сервак злодея‑работорговца Джаббы Хатта. Программа на этом сервере написана на C, потому что Джабба предпочитает олдскул.
Я предлагаю тебе скачать исходный код и, не изучая его, чтобы не подглядывать в разгадку, сразу скомпилировать. Первым делом клонируй репозиторий с моего GitHub. Далее компилируй сервер для 64-битной платформы, так как этот вариант для нас явно интереснее.
Находясь в каталоге с исходником нашего сервера, выполним компиляцию и сборку:
gcc server.c -o server64.elf
На выходе получаем исполняемый ELF-файл, над которым мы будем работать на протяжении статьи.
Запуск
Мы не знаем, что делает утянутый у Джаббы исполняемый файл, поэтому вначале просто запустим его и посмотрим. Неизвестные файлы лучше всего выполнять в изолированной среде, ведь в реальной жизни что только не приходится отлаживать. Поэтому я работаю в виртуальной машине, которая не содержит никаких ценных данных, что рекомендую и тебе.
Итак, из каталога HackThisServer запустим наш сервер:
./server64.elf
Ничего видимого не происходит: вероятно, программа ждет обращения.
В качестве клиента для подключения к запущенному серверу воспользуемся утилитой netcat, задав в параметрах адрес целевой машины и номер порта. В другом окне терминала введи (номер порта мы узнаем чуть позже, пока прими данный по умолчанию):
nc localhost 14884
В результате нас встретит экран авторизации.
Попробуем ввести xakep
. Сервер ответит: «These are not the droids you are looking for!». При этом сеанс netcat будет завершен.
Исследование: статический анализ
Использование Radare2 из командной строки похоже на работу с отладчиком GDB. Чтобы лучше усвоить команды R2, предлагаю первое время использовать именно консольный вариант, не прибегая к помощи визуальных оболочек. Давай посмотрим, как из командной строки проводить статическое исследование и динамический анализ бинарника.
Этап первый — подготовительный
Оставаясь в каталоге с ELF-файлом, натравим на него дизассемблер:
r2 server64.elf
Все последующие команды будут выполняться над указанным файлом, поэтому его имя больше вводить не понадобится.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»