
Emulador pcode multiarquitectura que utiliza Ghidra/Sleigh para el fuzzing con AFL++ de binarios, firmware y objetivos embebidos; detecta errores de corrupción de memoria mediante ASAN.

Ghidralligator es un emulador de pcode multiarquitectura en C++ basado en libsla de Ghidra, diseñado para fuzzing con AFL++.
Permite realizar fuzzing basado en emulación manteniendo unas prestaciones interesantes al tratar con binarios que se ejecutan en arquitecturas exóticas.
Su naturaleza extensible hace que sea fácil emular literalmente cualquier arquitectura (siempre que puedas escribir el archivo de especificación Sleigh correspondiente) para fuzzear un fragmento de código arbitrario.
Ghidralligator puede ejecutarse en sistemas Linux. Solo requiere disponer de una versión de GCC que soporte C++ versión 17 (probado y funcionando con GCC versión 12.2.0).
Las dependencias de Ghidra están integradas en el propio proyecto, bajo el directorio "./src/".
Para instalar Ghidralligator correctamente, debes descargar y compilar AFL++ de la siguiente manera:
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 tiene como objetivo llenar el vacío entre los emuladores ya existentes que requieren mucha configuración y modificaciones manuales para instrumentar, ejecutar y fuzzear el binario, y los emuladores de "caja negra", que difícilmente son extensibles y no son adecuados para aplicaciones específicas e inusuales.
Su uso principal es la investigación de vulnerabilidades en binarios de código cerrado, y especialmente cuando se apunta a aplicaciones/firmwares de dispositivos embebidos que se ejecutan en arquitecturas exóticas.
Ghidralligator es el sucesor de afl_ghidra_emu. Mejora enormemente la velocidad de ejecución e incluye funcionalidades útiles como la detección de corrupción de memoria dinámica (ASAN).
Se puede detectar una amplia variedad de corrupciones de memoria: operaciones de lectura/escritura fuera de los límites, use-after-free, double-free, lectura de memoria no inicializada, violaciones de acceso de lectura/escritura/ejecución...
Para ejecutar Ghidralligator, deben realizarse los siguientes pasos:
Para entender cómo usar Ghidralligator, se ha creado un ejemplo de un programa vulnerable, compilado en diferentes arquitecturas.
Puedes ejecutar run_examples.sh para ver los mecanismos de ASAN en acción.
Ghidralligator incluye varias opciones de línea de comandos:
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]
Uso para una emulación estándar:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

Uso para una sesión de fuzzing estándar con 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 puede emular código gracias al archivo .sla (archivo de definición de instrucciones Sleigh). Los archivos SLA proporcionados por la comunidad de Ghidra pueden estar implementados parcialmente. Para obtener una emulación consistente, los usuarios pueden tener que completar la definición de la arquitectura Sleigh correspondiente o añadir algunos hooks.
Ghidralligator está basado en Ghidra, que no está diseñado para tener un alto rendimiento con fines de emulación. Por lo tanto, no puede competir con fuzzers clásicos como afl_qemu en arquitecturas estándar (binarios x86 linux / windows).
Como el proyecto Ghidra está en constante evolución, no se recomienda actualizar manualmente las dependencias de Ghidralligator para futuras versiones de Ghidra. La herramienta fue construida y probada con las fuentes del descompilador de Ghidra 11.0.3. Puede romperse con versiones futuras, y no se admite la compatibilidad retroactiva con versiones anteriores a la 11.0.3. Esto es transparente para el usuario, ya que las dependencias de Ghidra se proporcionan en este repositorio.
Ghidralligator se distribuye bajo la licencia Apache versión 2.0.
El código de Ghidralligator incluye código del proyecto Ghidra de la NationalSecurityAgency, publicado bajo la licencia Apache 2.0.
El analizador del archivo de configuración de Ghidralligator incluye la librería json de C++ de Niels Lohmann, publicada bajo la licencia MIT.
El módulo de Ghidralligator incluye la librería xxHash de Yann Collet, publicada bajo la licencia BSD 2-Clause.