Обзор фреймворка для реверс-инжиниринга Ghidra

Ghidra

В марте 2019 года Агентство национальной безопасности США (NSA) опубликовало инструментарий для реверс-инжиниринга под названием Ghidra. Пару лет назад я уже слышал это название из утечек на сайте WikiLeaks и был весьма заинтересован, какими инструментами пользуются в NSA (АНБ) для реверса. Настала пора удовлетворить любопытство и посмотреть, хороша ли бесплатная «Гидра» в сравнении с зарекомендовавшими себя инструментами.

Можно ли доверять Ghidra от NSA?

АНБ в рамках программы Technology Transfer Program уже выложила исходники 32 проектов (полный список можете найти на GitHub). Конечно, не обходится без слухов о том, что АНБ будет использовать эти средства для слежения за пользователями. С одной стороны, конечно, код продуктов открыт, а их пользователи достаточно хардкорны, чтобы не полениться и сделать аудит. С другой — первая же проблема появилась сразу после релиза Ghidra.

Британский эксперт информационной безопасности Мэттью Хики (Matthew Hickey) заметил, что в отладочном режиме инструмент Ghidra открывает и слушает порт 18001. Это позволяет подключиться к Ghidra удаленно, через JDWP, — разумеется, с целью все той же отладки. Мэттью отмечает, что исправить этот косяк очень просто — достаточно поменять строку 150 в файле support/launch.sh со звездочки на 127.0.0.1.

Постепенно появляются и другие проблемы. Например, была найдена возможность эксплуатировать XXE при условии, что пользователь Ghidra откроет специально сформированный проект. Так что будьте бдительны!

Как скачать Ghidra NSA?

Скачать Ghidra можно с официального сайта ghidra-sre.org, но есть маленькая проблема: сайт недоступен из российских сетей (и, по некоторым данным, из канадских). Но я думаю, что это не препятствие. Ведь всегда можно воспользоваться бесплатным VPN или Tor или на худой конец каким-нибудь анонимайзером.

Архив Ghidra в распакованном виде
Архив Ghidra в распакованном виде

Итак, предположим вы уже скачали архив ghidra_9.0_PUBLIC_20190228 и распаковали его. Давайте немного пробежимся по основным папкам и посмотрим, что в них есть.

Настоятельно рекомендую заглянуть в директорию docs — там много интересной информации о самой Ghidra, о разработке плагинов для нее и обзор основных возможностей в виде слайдов и документов PDF. Вся инфа, конечно-же, на английском.

Далее идут папки с лицензиями — в них вы не найдете ничего интересного. В директории server лежит инструмент для запуска сервера удаленной отладки. В папке support собраны дополнительный инструментарий, без которого Гидра откажется работать.

В директории Ghidra уже интереснее: в Processors можно ознакомиться со всеми поддерживаемыми архитектурами. Вот их полный список: 6502, 68000, 6805, 8051, 8085, AARCH64, ARM, Atmel, CR16, DATA, JVM, MIPS, PA-RISC, PIC, PowerPC, Sparc, TI_MSP430, Toy, x86, Z80.

Папки с инструкциями для разных архитектур
Папки с инструкциями для разных архитектур

Обзор Ghidra

Пришло время рассмотреть само приложение. Чтобы открыть Ghidra в Windows, запускаем ghidraRun.bat, в Linux — ghidraRun.sh. Проект написан в основном на Java, поэтому необходимо скачать и установить Java Runtime.

Окно создания проекта Ghidra
Окно создания проекта

Первым делом нам предлагают создать проект, в который мы добавим нужные бинарные файлы для исследования. После этого становится активной иконка с зеленым драконом, которая и откроет для нас CodeBrowser — основную среду для работы.

Основное окно CodeBrowser Ghidra
Основное окно CodeBrowser

Сначала появляется окно с технической информацией о загружаемом файле, потом приглашение провести анализ и выбрать настройки для него. Соглашаемся.

Выглядит основной интерфейс довольно необычно — во всяком случае, для меня.

CodeBrowser
CodeBrowser

И вот мы оказываемся в заголовке нашего файла. Перед нами структура IMAGE_DOS_HEADER, а не точка входа. Интересно! Надо сказать, что все поля отображены хорошо, да и выглядит все более-менее сносно и информативно.

При первом запуске приложения я столкнулся с немного неудобным отображением кода и других полей в различных окнах дизассемблера. Но все это можно настроить при помощи специальной кнопки Edit the listing fields в верхнем правом углу каждого окна.

Справа находится окно декомпилятора, к нему мы вернемся позже. Там же есть вкладка Functions. Давайте нажмем на нее.

Вкладка Functions
Вкладка Functions

Здесь отображается список функций с их сигнатурами — довольно удобно. Давайте выберем какую-нибудь функцию и посмотрим, что произойдет.

Начальный код дизассемблированной функции Ghidra
Начальный код дизассемблированной функции

Это самое начало функции с ее сигнатурой, передаваемые в нее значения и их типы, возвращаемое значение, конвенция вызова и сам дизассемблерный листинг. В самом верху есть кнопка Display Function Graph, я ее выделил на скриншоте. Нажимаем на нее.

Графическое представление кода в Ghidra
Графическое представление кода в Ghidra
Графическое представление кода в IDA Pro
Графическое представление кода в IDA Pro

При наведении на кодовые блоки появляется прикольная анимация (видна на скриншоте). Я специально сделал два скриншота одной и той же функции: один в представлении графа в Ghidra, другой — в IDA Pro. Не знаю, как вам, но, на мой взгляд, информативнее граф в Ghidra. К тому же Ghidra помечает прямо в графе конструкции if… else. Я понимаю, что это все ребячество, но лично для меня графическое представление кода в Ghidra более информативно и удобно, нежели в IDA Pro. Кроме того, графическое представление весьма гибко настраивается.

Кроме того у Ghidra широкие возможности поиска — чтобы увидеть все варианты, достаточно выбрать в меню фреймворка пункт Search и посмотреть выпадающий список. Например, вот так выглядит диалог поиска по строкам.

Окно поиска по строкам Ghidra NSA
Окно поиска по строкам

Еще Ghidra отлично справляется с построением перекрестных ссылок на что угодно — чтобы воспользоваться этой возможностью, необходимо выбрать в контекстном меню пункт References, а после выбирать то, что вас интересует. Кроме этого, в начале каждой функции Ghidra старается сразу отобразить в комментариях перекрестные ссылки на эту функцию.

В Ghidra также имеется встроенный шестнадцатеричный просмотрщик. Чтобы его увидеть, нужно открыть меню «Windows → Bytes».

Встроенный HEX-просмотрщик Ghidra NSA
Встроенный HEX-просмотрщик

Ghidra из коробки поддерживает патчинг ассемблерного кода. Чтобы воспользоваться этой функцией, необходимо выделить строчку кода и нажать комбинацию Ctrl + Shift + G или выбрать соответствующий пункт в контекстном меню. Есть интересная визуальная фишка — если выделить какой-нибудь код в окне декомпилятора, то такой же код автоматически выделяется в окне дизассемблерного листинга. Прикольно!

Выделение кода в Ghidra
Выделение кода в Ghidra

Еще одна интересная функция Ghidra — это Script Manager, набор скриптов на все случаи жизни, поставляющийся из коробки. Если какого-то скрипта не хватает, разумеется, его можно добавить. Все скрипты написаны на Java. Чтобы вы понимали, о чем идет речь, прилагаю полный листинг скрипта CreateExportFileForDll.java. Что он делает, вы поймете из названия.

Скрипты можно редактировать во встроенном простеньком редакторе, а можно открывать в IDE Eclipse прямо из контекстного меню. Разумеется, Eclipse должен быть установлен.

Кроме того, есть разные полезные мелочи, типа встроенного диффера, возможности патчить код без всяких дополнительных плагинов, возможности смотреть энтропию кода и строить дерево вызовов в приложении (трассу). Имеется встроенный интерпретатор Python (не требуется его устанавливать отдельно, как в IDA) и другие приятные фишки.

Еще по теме: Инструменты для реверсинга приложений Android

Теперь давайте посмотрим на декомпилятор, который также идет в комплекте, а не отдельным плагином, как в IDA. Приведу сначала результат работы декомпилятора Ghidra, а потом и IDA Pro.

Это листинг Ghidra:

А это листинг IDA Pro Hex-Rays:

Как по мне, так листинг Ghidra читается попроще. Да, я знаю, что вывод Hex-Rays гибко настраивается. Кроме этого, имеется плагин HexRaysPyTools, который помогает улучшить результат. Но мы-то прежде всего говорим о том, что идет в комплекте, а Hex-Rays еще и стоит отдельных денег.

Так или иначе, модуль декомпиляции в Ghidra могучий и вполне может составить конкуренцию Hex-Rays. А если зайти в папку \Ghidra\Processors, затем выбрать любую архитектуру и далее зайти в \data\languages, можно увидеть файлы с расширениями *.slaspec и *.pspec и еще некоторые. Глядя на них, понимаешь, что написать поддержку своей архитектуры — не такая и сложная задача. Да, все-таки открытости кода сильно не хватает IDA Pro!

Что лучше Ghidra или IDA Pro?

Итак, мы рассмотрели фреймворк для реверс-инжиниринга Ghidra. Сможет ли он заменить IDA Pro? Я думаю, что на данном этапе своего существования — нет. Дело в том, что Java в качестве языка для написания подобных программ, на мой взгляд, не лучший выбор. И дело, конечно, в скорости.

Дизассемблер работает не настолько быстро как хотелось бы, особенно на больших файлах. Скажу больше: файлы размером свыше 150 Мбайт реверсить на Ghidra — та еще пытка. С другой стороны, Ghidra кросс-платформенна, и для кого-то это может стать большим и жирным плюсом.

Другой момент — это количество поддерживаемых архитектур и загрузчиков файлов: у IDA Pro их намного больше. Еще очень не хватает такой же плотной интеграции с отладчиками, как в IDA Pro. Опять же, открытость кодов (если NSA выполнит обещание) — это хорошо, да и возможность добавлять поддержку других архитектур — по-настоящему крутая фишка. Но пока будет выполнена эта работа (и исправлены баги), пройдут годы.

Вообще, у меня сложилось стойкое впечатление, что Ghidra — это не пока еще не конечный и немного сырой продукт. В том виде, в котором этот фреймворк доступен сейчас, он тянет на бета-версию с публичным доступом, но никак не на версию под номером девять. Кстати, в названии архива есть слово PUBLIC. Я уверен, что где-то в закромах АНБ есть еще и версия PRIVATE.

Безусловно, у Ghidra есть свои сильные стороны, и в чем-то она уже превосходит IDA Pro, но слабых мест пока что намного больше. А вот разработчикам IDA есть что позаимствовать в новом инструменте. Например, мне понравилась повышенная информативность кода, представленного в виде графа. Да и само построение графа кода выглядит более строго и упорядоченно. Есть патчинг инструкций без дополнительных плагинов и без разделения на x64 и x86. Зачем держать два ярлыка на рабочем столе, если достаточно одного?

На этом обзор Ghidra подошел к концу. На сегодня хватит, а в следующей статье мы рассмотрим Ghidra от NSA более пристально и разберемся как использовать Ghidra.

ВКонтакте
OK
Telegram
WhatsApp
Viber

Один комментарий

  1. gee12

    Поменяйте местами скрины «Окно поиска по строкам» и «Встроенный HEX-просмотрщик»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *