
Ein Fuzzing-Tool für Closed-Source-Binärdateien basierend auf Unicorn und LibFuzzer
uniFuzzer ist ein Fuzzing-Tool für Closed-Source-Binärdateien basierend auf Unicorn und LibFuzzer. Derzeit unterstützt es das Fuzzing von 32-Bit-LSB-ELF-Dateien auf ARM/MIPS, die typischerweise in IoT-Geräten vorkommen.
.c-Datei im Verzeichnis callback, die folgende Callbacks enthalten sollte:void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): Wird jedes Mal aufgerufen, wenn eine abhängige Bibliothek in Unicorn geladen wird.int uniFuzzerInit(uc_engine *uc): Wird direkt nach dem Laden aller Binärdateien in Unicorn aufgerufen. Hier können Stack/Heap/Register eingerichtet werden.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): Wird vor jeder Runde der Fuzzing-Ausführung aufgerufen.int uniFuzzerAfterExec(uc_engine *uc): Wird nach jeder Runde der Fuzzing-Ausführung aufgerufen.make aus und erhalten Sie das Fuzzing-Tool namens uf.uniFuzzer verwendet die folgenden Umgebungsvariablen als Parameter:
UF_TARGET: Pfad zur Ziel-ELF-DateiUF_PRELOAD: Pfad zur Preload-Bibliothek. Stellen Sie sicher, dass die Bibliothek die gleiche Architektur wie das Ziel hat.UF_LIBPATH: Pfade, in denen die abhängigen Bibliotheken liegen. Verwenden Sie :, um mehrere Pfade zu trennen.Und das Fuzzing kann mit folgendem Befehl gestartet werden:
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
Hier folgt eine Demo zur grundlegenden Verwendung. Die Demo enthält die folgenden Dateien:
vuln(), die anfällig für Stack/Heap-Überlauf ist.printf() und vereinfachte malloc()/free().vuln().Installieren Sie zunächst gcc für mipsel (Paket gcc-mipsel-linux-gnu auf Debian), um die Demo zu erstellen:
# the target binary
# '-Xlinker --hash-style=sysv' tells gcc to use 'DT_HASH' instead of 'DT_GNU_HASH' for symbol lookup
# since currently uniFuzzer does not support 'DT_GNU_HASH'
mipsel-linux-gnu-gcc demo-vuln.c -Xlinker --hash-style=sysv -no-pie -o demo-vuln
# the preload library
mipsel-linux-gnu-gcc -shared -fPIC -nostdlib -Xlinker --hash-style=sysv demo-libcpreload.c -o demo-libcpreload.so
Oder Sie können einfach die Dateien demo-vuln und demo-libcpreload.so verwenden, die mit den obigen Befehlen kompiliert wurden.
Als nächstes führen Sie make aus, um uniFuzzer zu erstellen. Beachten Sie, dass wenn Sie die MIPS-Demo selbst kompiliert haben, einige Adressen von der vorgefertigten abweichen können und demo-callback.c entsprechend aktualisiert werden muss.
Stellen Sie schließlich sicher, dass die libc-Bibliothek für MIPS bereit ist. Auf Debian befindet sie sich unter /usr/mipsel-linux-gnu/lib/ nach der Installation des Pakets libc6-mipsel-cross, und genau darauf sollte UF_LIBPATH verweisen:
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn löscht den JIT-Cache von QEMU aufgrund dieses Issues, was die Fuzzing-Geschwindigkeit verlangsamt, da die Ziel-Binärdatei bei jeder Ausführungsrunde neu JIT-kompiliert werden müsste.
Wir können tb_flush(env); auskommentieren, wie in diesem Issue für die Leistung angegeben.
GNU_HASHIFUNC