
Multi-Architektur-Pcode-Emulator basierend auf Ghidra/Sleigh für AFL++-Fuzzing von Binärdateien, Firmware und eingebetteten Zielsystemen; erkennt Speicherkorruptionsfehler über ASAN.

Ghidralligator ist ein C++-Multi-Architektur-pcode-Emulator, der auf der Ghidra-libsla basiert und für das Fuzzing mit AFL++ entwickelt wurde.
Er ermöglicht emulationsbasiertes Fuzzing und behält dabei interessante Leistungswerte bei, wenn es um Binärdateien geht, die auf exotischen Architekturen laufen.
Dank seiner erweiterbaren Natur lässt sich im Grunde jede Architektur emulieren (sofern man die entsprechende Sleigh-Spezifikationsdatei schreiben kann), um beliebigen Code zu fuzzen.
Ghidralligator kann auf Linux-Systemen ausgeführt werden. Es erfordert lediglich eine GCC-Version, die C++17 unterstützt (getestet und funktionsfähig mit GCC-Version 12.2.0).
Die Ghidra-Abhängigkeiten sind direkt im Projekt unter dem Verzeichnis ./src/ eingebettet.
Um Ghidralligator ordnungsgemäß zu installieren, müssen Sie AFL++ wie folgt herunterladen und kompilieren:
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
./specfiles.Ghidralligator zielt darauf ab, die Lücke zwischen bereits bestehenden Emulatoren, die viel Einrichtungsaufwand und manuelle Änderungen erfordern, um die Binärdatei zu instrumentieren, auszuführen und zu fuzzen, und den „Black-Box“-Emulatoren zu schließen, die kaum erweiterbar und für spezifische und ungewöhnliche Anwendungen nicht geeignet sind.
Der Hauptverwendungszweck ist die Schwachstellenforschung in Closed-Source-Binärdateien, insbesondere bei Anwendungen/Firmware von eingebetteten Geräten, die auf exotischen Architekturen laufen.
Ghidralligator ist der Nachfolger von afl_ghidra_emu. Es verbessert die Ausführungsgeschwindigkeit erheblich und enthält nützliche Funktionen wie die Erkennung von Heap-Speicherkorruption (ASAN).
Eine Vielzahl von Speicherkorruptionen kann erkannt werden: Out-of-Bounds-Lese-/Schreiboperationen, Use-after-Free, Double-Free, Lesen von nicht initialisiertem Speicher, Lese-/Schreib-/Ausführungs-Zugriffsverletzungen ...
Um Ghidralligator auszuführen, müssen die folgenden Schritte durchgeführt werden:
Um zu verstehen, wie man Ghidralligator verwendet, wurde ein Beispiel eines verwundbaren Programms erstellt, das für verschiedene Architekturen kompiliert wurde.
Sie können run_examples.sh ausführen, um die ASAN-Mechanismen in Aktion zu sehen.
Ghidralligator bietet mehrere Befehlszeilenoptionen:
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]
Verwendung für eine Standard-Emulation:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

Verwendung für eine standardmäßige AFL++-Fuzzing-Sitzung:
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 kann Code mithilfe von .sla-Dateien (Sleigh-Befehlsdefinitionsdatei) emulieren. SLA-Dateien, die von der Ghidra-Community bereitgestellt werden, können teilweise implementiert sein. Um eine konsistente Emulation zu erhalten, müssen Benutzer möglicherweise die zugehörige Sleigh-Architekturdefinition vervollständigen oder einige Hooks hinzufügen.
Ghidralligator basiert auf Ghidra, das nicht für hohe Leistung bei der Emulation ausgelegt ist. Daher kann es nicht mit klassischen Fuzzern wie afl_qemu auf Standardarchitekturen (x86-Linux-/Windows-Binärdateien) konkurrieren.
Da das Ghidra-Projekt sich ständig weiterentwickelt, wird empfohlen, die Ghidralligator-Abhängigkeiten für zukünftige Ghidra-Versionen nicht manuell zu aktualisieren. Das Tool wurde mit den Quellen des Ghidra-11.0.3-Dekompilierers erstellt und getestet. Es könnte mit zukünftigen Versionen brechen, und Abwärtskompatibilität unterhalb von Version 11.0.3 wird nicht unterstützt. Dies ist für den Benutzer transparent, da die Ghidra-Abhängigkeiten in diesem Repository bereitgestellt werden.
Ghidralligator wird unter der Apache-Lizenz Version 2.0 veröffentlicht.
Der Ghidralligator-Code enthält Code aus dem Ghidra-Projekt von NationalSecurityAgency, veröffentlicht unter der Apache-Lizenz 2.0.
Der Parser für die Ghidralligator-Konfigurationsdatei enthält die C++-JSON-Bibliothek von Niels Lohmann, veröffentlicht unter der MIT-Lizenz.
Das Ghidralligator-Modul enthält die xxHash-Bibliothek von Yann Collet, veröffentlicht unter der BSD-2-Clause-Lizenz.