Содержание статьи
В статье «Отладка программ без исходников. Анализируем двоичные файлы в 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
находятся подпапки со всеми перечисленными выше утилитами.
![Содержимое подкаталога binr Содержимое подкаталога binr](https://static.xakep.ru/images/2fbddb3988e1720eb7fc5678cfa3abcd/37124/pic01-binr-content.png)
Заодно установим vim, если его нет в системе:
sudo apt install vim
Хотя, если предпочитаешь nano или другой редактор, ты волен ставить, что тебе больше нравится.
Объект анализа
Итак, представим, что наш Linux находится в далекой‑предалекой галактике и нам, героям, нужно взломать сервак злодея‑работорговца Джаббы Хатта. Программа на этом сервере работает на C, потому что Джабба предпочитает олдскул.
Я предлагаю тебе скачать исходный код и, не изучая его, чтобы не подглядывать в разгадку, сразу скомпилировать. Первым делом клонируй репозиторий с моего GitHub. Далее компилируй сервер для 64-битной платформы, так как этот вариант для нас явно интереснее.
Находясь в каталоге с исходником нашего сервера, выполним компиляцию и сборку:
gcc server.c -o server64.elf
На выходе получаем исполняемый ELF-файл, над которым мы будем работать на протяжении статьи.
Запуск
Мы не знаем, что делает утянутый у Джаббы исполняемый файл, поэтому вначале просто запустим его и посмотрим. Неизвестные файлы лучше всего выполнять в изолированной среде, ведь в реальной жизни что только не приходится отлаживать. Поэтому я работаю в виртуальной машине, которая не содержит никаких ценных данных, что рекомендую и тебе.
Итак, из каталога HackThisServer запустим наш сервер:
./server64.elf
Ничего видимого не происходит: вероятно, программа ждет обращения.
В качестве клиента для подключения к запущенному серверу воспользуемся утилитой netcat, задав в параметрах адрес целевой машины и номер порта. В другом окне терминала введи (номер порта мы узнаем чуть позже, пока прими данный по умолчанию):
nc localhost 14884
В результате нас встретит экран авторизации.
![Система канализации Джаббы Система канализации Джаббы](https://static.xakep.ru/images/2fbddb3988e1720eb7fc5678cfa3abcd/37121/pic04-netcat.png)
Попробуем ввести xakep
. Сервер ответит: «These are not the droids you are looking for!». При этом сеанс netcat будет завершен.
Исследование: статический анализ
Использование Radare2 из командной строки похоже на работу с отладчиком GDB. Чтобы лучше усвоить команды R2, предлагаю первое время использовать именно консольный вариант, не прибегая к помощи визуальных оболочек. Давай посмотрим, как из командной строки проводить статическое исследование и динамический анализ бинарника.
Этап первый — подготовительный
Оставаясь в каталоге с ELF-файлом, натравим на него дизассемблер:
r2 server64.elf
Все последующие команды будут выполняться над указанным файлом, поэтому его имя больше вводить не понадобится.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее