RetroWrite es un reescritor binario estático para X64 y AARCH64. Funciona sin heurística, no introduce gastos generales y utiliza la técnica de simbolización (también conocida como ensamblaje reapobrable ) para insertar instrumentación a binarios sin la necesidad de código fuente.
Tenga en cuenta que la versión X64 y la versión ARM64 utilizan diferentes algoritmos de reescritura y admiten un conjunto diferente de características.
Para detalles técnicos, puede leer el documento (en IEEE S & P'20 ) para la versión X64 y esta tesis para la versión ARM64.
Krecrowrite es una variante de la versión X64 que admite la reescritura de los módulos de núcleo Linux.
RetroWRite se implementa en Python3 (3.6). Depende de pyelftools y capstone . Para instalar las dependencias, ejecute:
pip install - r requirements . txtNo se recomienda instalar las dependencias de los administradores de paquetes de su distribución, ya que podrían estar desactualizados.
| retrowsite-x64 | RetroWrite-Aarch64 | |
|---|---|---|
| binarios pelados | (WIP) | ✅ |
| Binarios no | ✅ | |
| Compiladores no estándar | ✅ | |
| Cero sobrecarga | ✅ | ✅ |
| Soporte de módulos de kernel | ✅ | |
| Instrumentación de cobertura de AFL | ✅ | ✅ |
| Instrumentación de Asan | ✅ | ✅ |
| Soporte de C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output Seleccione el pase de instrumentación que desea aplicar con retrowrite -m <pass> Puede encontrar los pases de instrumentación disponibles en carpetas rwtools_x64 y rwtools_arm64 .
Pasos de instrumentación disponibles para x64: - DirectsAnitizer - Información de cobertura AFL
Pasos de instrumentación disponibles para AARCH64: - DirectSanitizer - Información de coberve de AFL + Forservador - Integridad de flujo de control de grano grueso en entradas de función
retrowrite --asan </path/to/binary/> </path/to/output/binary>
Nota: Si en X64, asegúrese de que el binario sea independiente de la posición y no se despoja. Esto se puede verificar usando el comando file (la salida debe decir ELF shared object ).
Ejemplo, cree una versión instrumentada de /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
Esto generará un archivo de ensamblaje ( .s ). Para volver a compilar el ensamblaje en un binario, depende de la arquitectura:
El ensamblaje generado se puede ensamblar y vincular utilizando cualquier compilador, como:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Depurar en caso de que reciba el error undefined reference to `__asan_init_v4' , reemplace" asan_init_v4 "por" asan_init "en el archivo de ensamblaje, el siguiente comando puede ayudarlo a hacerlo: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
En AARCH64, también confiamos en los compiladores estándar para ensamblar y vincular, pero la colección de banderas de compiladores está un poco más involucrada y, por lo tanto, proporcionamos el interruptor -a en el ejecutable retrowrite principal para hacerlo por usted:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Para generar un binario instrumentado con AFL, primero genere el ensamblaje simbolizado como se describió anteriormente. Luego, vuelva a compilar el ensamblaje simbolizado con afl-gcc de AFL ++ como este:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
o afl-clang .
Para instrumentar un binario con información de cobertura, use el pase de instrumentación de cobertura con retrowrite -m coverage <input file> <output asm> . Vuelva a ensamblar el binario con retrowrite -a <output asm> <new binary> .
El binario ahora se puede confundir con:
afl-fuzz -i < seed folder > -o < out folder > < new binary > RetroWrite también intenta agregar instrumentación para actuar como un bifurcador para AFL; En caso de que esto cause problemas, puede deshabilitar este comportamiento mediante export AFL_NO_FORKSERVER=1
Para generar un ensamblaje simbolizado que pueda modificarse a mano o postprocesarse con herramientas existentes, simplemente no especifique ningún paso de instrumentación:
retrowrite </path/to/binary> <path/to/output/asm/files>
Los archivos ASM de salida se pueden editar libremente a mano o por otras herramientas. Post-modificación, los archivos ASM pueden ensamblarse a binarios de trabajo como se describió anteriormente.
Si bien la retrogrita es interoperable con otras herramientas, ¡alentamos encarecidamente a los investigadores a usar la API de RetroWrite para sus necesidades de instrumentación / modificación binaria! Esto guarda el esfuerzo adicional de tener que cargar y analizar binarios o archivos de ensamblaje.
Ejecutar setup.sh :
./setup.sh kernelActive el VirtualEnv (desde la raíz del repositorio):
source retro/bin/activate(Bonificación) para salir de VirtualEnv cuando hayas terminado con RetroWrite:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> Para la campaña Fuzzing, consulte Fuzzing/ Carpeta.
En general, librw/ contiene el código para la carga, el desmontaje y la simbolización de binarios y forma el núcleo de todas las transformaciones. La transformación individual pasa que se construyen en la parte superior de este marco de reescritura, como nuestro desinfectante de dirección binario (BASAN) está contenido como herramientas individuales en rwtools/ .
Los archivos y la carpeta que comienzan con k están vinculados con la versión Kernel RetroWrite.
En las demostraciones/carpeta, encontrará ejemplos para el espacio de usuario y la retrograma del kernel (Demos/User_Demo y Demos/Kernel_Demo respectivamente).
Las siguientes publicaciones cubren diferentes partes del proyecto RetroWrite:
RECROWRITE: Instrumento estáticamente binarios de cunas para borrosos y desinfectación Sushant Dinesh, Nathan Burow, Dongyan Xu y Mathias Payer. En Oakland'20: Simposio Internacional IEEE sobre seguridad y privacidad, 2020
¡Sin fuente, no hay problema! Matteo Rizzo y Payer de Mathias de alta velocidad . En 36C3'19: Congreso de comunicación del caos, 2019
La licencia del MIT
Copyright (c) 2019 Hexhive Group, Sushant Dinesh [email protected], Luca di Bartolomeo [email protected], Antony Vennard [email protected], Matteo Rizzo Matteorizzo.personal.com, Mathias Payer.payer
El permiso se otorga, de forma gratuita, a cualquier persona que obtenga una copia de este software y archivos de documentación asociados (el "software"), para tratar en el software sin restricción, incluidos los derechos de los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicense y/o vender copias del software, y para permitir que las personas a quienes se les proporciona el software para hacer, sujeto a las siguientes condiciones: las siguientes condiciones: las siguientes condiciones: las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o porciones sustanciales del software.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluidas, entre otros, las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otra manera, que surge, de o en relación con el software o el uso u otros tratos en el software.