
Uno strumento di fuzzing per binari closed-source basato su Unicorn e LibFuzzer
uniFuzzer è uno strumento di fuzzing per binari closed-source basato su Unicorn e LibFuzzer. Attualmente supporta il fuzzing di file ELF LSB a 32 bit su ARM/MIPS, che si trovano comunemente nei dispositivi IoT.
.c nella directory callback, che deve contenere le seguenti callback:void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): viene invocata ogni volta che una libreria dipendente viene caricata in Unicorn.int uniFuzzerInit(uc_engine *uc): viene invocata subito dopo che tutti i binari sono stati caricati in Unicorn. Qui si possono impostare stack/heap/registri.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): viene invocata prima di ogni ciclo di esecuzione del fuzzing.int uniFuzzerAfterExec(uc_engine *uc): viene invocata dopo ogni ciclo di esecuzione del fuzzing.make e ottieni lo strumento di fuzzing chiamato uf.uniFuzzer utilizza le seguenti variabili d'ambiente come parametri:
UF_TARGET: Percorso del file ELF targetUF_PRELOAD: Percorso della libreria preload. Assicurati che la libreria abbia la stessa architettura del target.UF_LIBPATH: Percorsi in cui risiedono le librerie dipendenti. Usa : per separare più percorsi.Il fuzzing può essere avviato con il seguente comando:
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
Ecco una demo per l'uso di base. La demo contiene i seguenti file:
vuln() vulnerabile a stack/heap overflow.printf() vuota e un malloc()/free() semplificato.vuln().Prima, installa gcc per mipsel (pacchetto gcc-mipsel-linux-gnu su Debian) per compilare la demo:
# il binario target
# '-Xlinker --hash-style=sysv' dice a gcc di usare 'DT_HASH' invece di 'DT_GNU_HASH' per la ricerca dei simboli
# poiché al momento uniFuzzer non supporta 'DT_GNU_HASH'
mipsel-linux-gnu-gcc demo-vuln.c -Xlinker --hash-style=sysv -no-pie -o demo-vuln
# la libreria preload
mipsel-linux-gnu-gcc -shared -fPIC -nostdlib -Xlinker --hash-style=sysv demo-libcpreload.c -o demo-libcpreload.so
Oppure puoi usare direttamente i file demo-vuln e demo-libcpreload.so, già compilati con i comandi sopra.
Successivamente, esegui make per compilare uniFuzzer. Nota che se hai compilato la demo MIPS manualmente, alcuni indirizzi potrebbero differire da quelli precompilati e demo-callback.c deve essere aggiornato di conseguenza.
Infine, assicurati che la libreria libc per MIPS sia disponibile. Su Debian si trova in /usr/mipsel-linux-gnu/lib/ dopo l'installazione del pacchetto libc6-mipsel-cross, ed è questo il valore che UF_LIBPATH deve avere:
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn cancella la cache JIT di QEMU a causa di questo problema, rallentando la velocità del fuzzing poiché il binario target dovrebbe essere ricompilato JIT durante ogni ciclo di esecuzione.
Possiamo commentare tb_flush(env); come indicato in quel problema per migliorare le prestazioni.
GNU_HASHIFUNC