
Un outil de fuzzing pour binaires closed-source basé sur Unicorn et LibFuzzer
uniFuzzer est un outil de fuzzing pour les binaires closed-source basé sur Unicorn et LibFuzzer. Actuellement, il supporte le fuzzing des fichiers ELF 32 bits LSB sur ARM/MIPS, que l'on trouve généralement dans les appareils IoT.
.c dans le répertoire callback, qui doit contenir les callbacks suivants :void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr) : Elle est invoquée à chaque fois qu'une bibliothèque dépendante est chargée dans Unicorn.int uniFuzzerInit(uc_engine *uc) : Elle est invoquée juste après que tous les binaires aient été chargés dans Unicorn. La pile/tas/registres peuvent être configurés ici.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len) : Elle est invoquée avant chaque cycle d'exécution du fuzzing.int uniFuzzerAfterExec(uc_engine *uc) : Elle est invoquée après chaque cycle d'exécution du fuzzing.make et obtenez l'outil de fuzzing nommé uf.uniFuzzer utilise les variables d'environnement suivantes comme paramètres :
UF_TARGET : Chemin du fichier ELF cibleUF_PRELOAD : Chemin de la bibliothèque de préchargement. Assurez-vous que la bibliothèque a la même architecture que la cible.UF_LIBPATH : Chemins dans lesquels se trouvent les bibliothèques dépendantes. Utilisez : pour séparer plusieurs chemins.Et le fuzzing peut être démarré avec la commande suivante :
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
Voici une démonstration pour une utilisation de base. La démo contient les fichiers suivants :
vuln() qui est vulnérable aux débordements de pile/tas.printf() vide et malloc()/free() simplifiés.vuln() de la démo.Tout d'abord, veuillez installer gcc pour mipsel (paquet gcc-mipsel-linux-gnu sur Debian) pour construire la démo :
# 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
Ou vous pouvez simplement utiliser les fichiers demo-vuln et demo-libcpreload.so, qui sont compilés avec les commandes ci-dessus.
Ensuite, exécutez make pour construire uniFuzzer. Veuillez noter que si vous avez compilé la démo MIPS vous-même, certaines adresses peuvent être différentes de celles préconstruites et demo-callback.c doit être mis à jour en conséquence.
Enfin, assurez-vous que la bibliothèque libc de MIPS est prête. Sur Debian, elle se trouve dans /usr/mipsel-linux-gnu/lib/ après l'installation du paquet libc6-mipsel-cross, et c'est ce que UF_LIBPATH doit être :
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn vide le cache JIT de QEMU en raison de ce problème, ce qui ralentit la vitesse du fuzzing car le binaire cible doit être re-compilé JIT à chaque cycle d'exécution.
Nous pouvons commenter tb_flush(env); comme indiqué dans ce problème pour des performances.
GNU_HASHIFUNC