
Мультиархитектурный pcode-эмулятор на базе Ghidra/Sleigh для фаззинга AFL++ бинарных файлов, прошивок и встраиваемых устройств; обнаруживает ошибки повреждения памяти с помощью ASAN.

Ghidralligator — это C++ мультиархитектурный pcode эмулятор, основанный на Ghidra libsla и предназначенный для фаззинга с помощью AFL++.
Он позволяет выполнять фаззинг на основе эмуляции, сохраняя при этом хорошую производительность при работе с бинарными файлами, выполняемыми на экзотических архитектурах.
Благодаря расширяемой природе Ghidralligator можно буквально эмулировать любую архитектуру (при условии, что вы можете написать соответствующий файл спецификации Sleigh) для фаззинга произвольного фрагмента кода.
Ghidralligator может работать в Linux. Для этого требуется только версия GCC, поддерживающая C++17 (протестировано и работает на GCC версии 12.2.0).
Зависимости Ghidra встроены в сам проект в каталоге "./src/".
Для правильной установки Ghidralligator необходимо загрузить и скомпилировать AFL++ следующим образом:
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
make distrib
sudo make install
git clone https://github.com/airbus-cyber/ghidralligator
cd ghidralligator
make ghidralligator
Ghidralligator призван заполнить разрыв между уже существующими эмуляторами, требующими большой настройки и ручных модификаций для инструментирования, запуска и фаззинга бинарных файлов, и «черно-ящиковыми» эмуляторами, которые трудно расширять и которые не подходят для специфических и необычных применений.
Основное применение — исследование уязвимостей в бинарных файлах с закрытым исходным кодом, особенно при работе с приложениями/прошивками встраиваемых устройств, работающих на экзотических архитектурах.
Ghidralligator является преемником afl_ghidra_emu. Он значительно повышает скорость выполнения и включает полезные функции, такие как обнаружение повреждения кучи (ASAN).
Можно обнаружить самые разные повреждения памяти: чтение/запись за пределами границ, use-after-free, double-free, чтение неинициализированной памяти, нарушения прав доступа чтения/записи/исполнения...
Для запуска Ghidralligator необходимо выполнить следующие шаги:
Чтобы понять, как использовать Ghidralligator, был создан пример уязвимой программы, скомпилированной для разных архитектур.
Вы можете запустить run_examples.sh, чтобы увидеть механизмы ASAN в действии.
Ghidralligator поставляется с несколькими параметрами командной строки:
usage: ./ghidralligator [OPTION]
-h Print this help and exit.
-m [replay|fuzz] Specify an emulation strategy. [REQUIRED]
In 'replay' mode, the emulator will only launch the program once, exiting after a single loop.
In 'fuzz' mode, this program must be launched through AFL.
-c [FILENAME] Specify the emulator json configuration file to load. [REQUIRED]
-i [FILENAME] Specify a test-case file to insert during a replay session. [OPTIONAL]
-I Display info log (/!\ Slow down the emulation). [OPTIONAL]
-D Display debug and info log (/!\ Slow down the emulation). [OPTIONAL]
-t Store log in ./ghidraligator.log file. [OPTIONAL]
Использование для стандартной эмуляции:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

Использование для стандартного сеанса фаззинга AFL++:
mkdir afl_inputs afl_outputs
echo -n "AAAAAA" > ./afl_inputs/input.bin
$ AFL_SKIP_BIN_CHECK=1 afl-fuzz -D -i ./afl_inputs -o ./afl_outputs/ -- ./ghidralligator -m fuzz -c examples/x86/config.json

Ghidralligator может эмулировать код благодаря файлу .sla (файл определения инструкций Sleigh). Файлы SLA, предоставляемые сообществом Ghidra, могут быть реализованы частично. Для обеспечения корректной эмуляции пользователям может потребоваться дополнить соответствующее определение архитектуры Sleigh или добавить некоторые хуки.
Ghidralligator основан на Ghidra, которая не предназначена для высокопроизводительной эмуляции. Таким образом, он не может конкурировать с классическими фаззерами, такими как afl_qemu, на стандартных архитектурах (бинарные файлы x86 Linux / Windows).
Поскольку проект Ghidra постоянно развивается, не рекомендуется вручную обновлять зависимости Ghidralligator для будущих версий Ghidra. Инструмент был собран и протестирован с исходными кодами декомпилятора Ghidra 11.0.3. Он может перестать работать с будущими версиями, а обратная совместимость с версиями ниже 11.0.3 не поддерживается. Это незаметно для пользователя, поскольку зависимости Ghidra предоставляются в этом репозитории.
Ghidralligator выпущен под лицензией Apache версии 2.0.
Код Ghidralligator включает код проекта Ghidra от NationalSecurityAgency, выпущенный под лицензией Apache 2.0.
Парсер файлов конфигурации Ghidralligator включает C++ библиотеку json от Niels Lohmann, выпущенную под лицензией MIT.
Модуль Ghidralligator включает библиотеку xxHash от Yann Collet, выпущенную под лицензией BSD 2-Clause.