
Una herramienta de fuzzing para binarios de código cerrado basada en Unicorn y LibFuzzer
uniFuzzer es una herramienta de fuzzing para binarios de código cerrado basada en Unicorn y LibFuzzer. Actualmente soporta fuzzing de archivos ELF LSB de 32 bits en ARM/MIPS, que suelen encontrarse en dispositivos IoT.
.c en el directorio callback, que debe contener las siguientes funciones de callback:void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): Se invoca cada vez que se carga una biblioteca dependiente en Unicorn.int uniFuzzerInit(uc_engine *uc): Se invoca justo después de que todos los binarios se hayan cargado en Unicorn. Aquí se pueden configurar la pila/el montón/los registros.int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): Se invoca antes de cada ronda de ejecución de fuzzing.int uniFuzzerAfterExec(uc_engine *uc): Se invoca después de cada ronda de ejecución de fuzzing.make y obtén la herramienta de fuzzing llamada uf.uniFuzzer utiliza las siguientes variables de entorno como parámetros:
UF_TARGET: Ruta del archivo ELF objetivoUF_PRELOAD: Ruta de la biblioteca precargada. Asegúrate de que la biblioteca tenga la misma arquitectura que el objetivo.UF_LIBPATH: Rutas donde residen las bibliotecas dependientes. Usa : para separar múltiples rutas.Y el fuzzing se puede iniciar usando el siguiente comando:
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
Aquí hay una demostración de uso básico. La demostración contiene los siguientes archivos:
vuln() que es vulnerable a desbordamiento de pila/montón.printf() vacío y malloc()/free() simplificados.vuln() de la demostración.Primero, instala gcc para mipsel (paquete gcc-mipsel-linux-gnu en Debian) para compilar la demostración:
# 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
O simplemente puedes usar los archivos demo-vuln y demo-libcpreload.so, que están compilados usando los comandos anteriores.
A continuación, ejecuta make para compilar uniFuzzer. Ten en cuenta que si compilaste la demostración MIPS por tu cuenta, algunas direcciones pueden ser diferentes de las precompiladas y demo-callback.c debe actualizarse en consecuencia.
Finalmente, asegúrate de que la biblioteca libc de MIPS esté lista. En Debian está en /usr/mipsel-linux-gnu/lib/ después de instalar el paquete libc6-mipsel-cross, y eso es lo que debe ser UF_LIBPATH:
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn borra la caché JIT de QEMU debido a este issue, lo que ralentiza la velocidad del fuzzing ya que el binario objetivo tendría que ser recompilado JIT durante cada ronda de ejecución.
Podemos comentar tb_flush(env); como se indica en ese issue para mejorar el rendimiento.
GNU_HASHIFUNC