
Emulatore pcode multi-architettura che utilizza Ghidra/Sleigh per il fuzzing AFL++ di binari, firmware e target embedded; rileva bug di corruzione della memoria tramite ASAN.

Ghidralligator è un emulatore pcode multi-architettura in C++ basato su Ghidra libsla, progettato per il fuzzing con AFL++.
Consente di eseguire fuzzing basato su emulazione mantenendo prestazioni interessanti quando si ha a che fare con binari che girano su architetture esotiche.
La sua natura estensibile rende facile emulare letteralmente qualsiasi architettura (purché si possa scrivere il corrispondente file di specifica Sleigh) per fare fuzzing su un qualsiasi pezzo di codice.
Ghidralligator può essere eseguito su sistemi Linux. Richiede solo una versione di GCC che supporti C++ 17 (testata e funzionante con GCC versione 12.2.0).
Le dipendenze di Ghidra sono incluse nel progetto stesso, nella directory "./src/".
Per installare correttamente Ghidralligator, è necessario scaricare e compilare AFL++ come segue:
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 mira a colmare il divario tra gli emulatori già esistenti che richiedono molta configurazione e modifiche manuali per strumentare, eseguire e fare fuzzing del binario, e gli emulatori "scatola nera" che sono difficilmente estensibili e non adatti ad applicazioni specifiche e inusuali.
Il suo uso principale è la ricerca di vulnerabilità in binari closed-source, e in particolare quando si ha come target applicazioni/firmware di dispositivi embedded che girano su architetture esotiche.
Ghidralligator è il successore di afl_ghidra_emu. Migliora notevolmente la velocità di esecuzione e include funzionalità utili come il rilevamento della corruzione della memoria heap (ASAN).
È possibile rilevare un'ampia varietà di corruzioni di memoria: operazioni di lettura/scrittura fuori dai limiti, use-after-free, double-free, lettura di memoria non inizializzata, violazioni di accesso in lettura/scrittura/esecuzione...
Per eseguire Ghidralligator è necessario effettuare i seguenti passaggi:
Per capire come usare Ghidralligator, è stato realizzato un esempio di programma vulnerabile, compilato su diverse architetture.
Puoi eseguire run_examples.sh per vedere i meccanismi ASAN in azione.
Ghidralligator viene fornito con diverse opzioni da riga di comando:
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]
Utilizzo per un'emulazione standard:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

Utilizzo per una sessione di fuzzing AFL++ standard:
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 può emulare codice grazie al file .sla (file di definizione delle istruzioni Sleigh). I file SLA forniti dalla comunità di Ghidra possono essere implementati solo parzialmente. Per ottenere un'emulazione coerente, gli utenti potrebbero dover completare la relativa definizione dell'architettura Sleigh o aggiungere alcuni hook.
Ghidralligator è basato su Ghidra, che non è progettato per avere alte prestazioni a scopo di emulazione. Pertanto non è in grado di competere con fuzzer classici come afl_qemu su architetture standard (binari x86 Linux/Windows).
Poiché il progetto Ghidra è in costante evoluzione, non è consigliato aggiornare manualmente le dipendenze di Ghidralligator per le versioni future di Ghidra. Lo strumento è stato costruito e testato con le sorgenti del decompilatore Ghidra 11.0.3. Potrebbe rompersi con versioni future, e la compatibilità all'indietro con versioni precedenti alla 11.0.3 non è supportata. Questo è trasparente per l'utente, poiché le dipendenze di Ghidra sono fornite in questo repository.
Ghidralligator è rilasciato sotto la licenza Apache versione 2.0.
Il codice di Ghidralligator include codice dal progetto Ghidra della NationalSecurityAgency, rilasciato sotto la licenza Apache 2.0.
Il parser del file di configurazione di Ghidralligator include la libreria json C++ di Niels Lohmann, rilasciata sotto la licenza MIT.
Il modulo Ghidralligator include la libreria xxHash di Yann Collet, rilasciata sotto la licenza BSD 2-Clause.