Tigress es un virtualizador/obfuscador de diversificación para el lenguaje C que respalda muchas defensas novedosas contra los ataques de ingeniería inversa estática y dinámica y desvirtualización. En particular, la tigresa protege contra la desvirtualización estática mediante la generación de conjuntos de instrucciones virtuales de complejidad y diversidad arbitrarias, produciendo intérpretes con múltiples tipos de envío de instrucciones e insertando código para el análisis anti-alias. La tigresa protege contra la desvirtualización dinámica fusionando el código real con funciones falsas, insertando un flujo implícito y creando intérpretes de reenetrantes que explican lentamente. Tigress implementa su propia versión del empaque de código mediante el uso de la generación de código de tiempo de ejecución. Finalmente, la transformación dinámica de Tigress proporciona una forma generalizada de modificación continua del código de tiempo de ejecución.
El equipo de Tigress ha brindado algunos desafíos en los que podemos encontrar diferentes tipos de protecciones
Todos los desafíos toman como entrada un número y devuelven un hash. Ejemplo:
$ ./obfuscated_binaries/tigress-2-challenge-2 1234 202180712448 $ ./obfuscated_binaries/tigress-2-challenge-2 823748 50564355584 $ ./obfuscated_binaries/tigress-2-challenge-2 2834723 50714072576
La función de cálculo hash está ofuscada. Tipos de posibles ataques:
Nuestros objetivos eran:
Y todo esto con una sola escritura genérica :). Para hacerlo, hicimos en el siguiente orden:
Si desea más información, puede consultar nuestro script Solve-Vm.py.

Sin embargo, ya presionamos todos nuestros resultados en este repositorio, pero si desea reproducir por sí mismo este análisis, solo tiene que ejecutar solve-vm.py así:
$ ./solve-vm.py ./obfuscated_binaries/_binary_
Ejemplo:
$ ./solve-vm.py ./tigress-challenges/tigress-0-challenge-0 [+] Carga 0x400040 - 0x400238 [+] Carga 0x400238 - 0x400254 [+] Carga 0x400000 - 0x400f14 [+] Carga 0x601e28 - 0x602550 [+] Carga 0x601e50 - 0x601fe0 [+] Carga 0x400254 - 0x400298 [+] Carga 0x400dc4 - 0x400e08 [+] Carga 0x000000 - 0x000000 [+] Carga 0x601e28 - 0x602000 [+] Enganchar printf [+] Enganchando __libc_start_main [+] Enganche strtoul [+] Emulación inicial. [+] __libc_start_main enganchado [+] argv [0] = ./tigress-challenges/tigress-0 challenge-0 [+] argv [1] = 1234 [+] Strtoul enganchado [+] Simbolizando el regreso de Strtoul [+] printf enganchado 3035321144166078008 [+] Corte de expresión del usuario del punto final [-] Instrucción no compatible: 0x400539: HLT [+] Instrucción ejecutada: 39816 [+] Instrucción única ejecutada: 458 [+] PC Len: 0 [+] Emulación hecha. [+] Generación de Symbolic_Expressions/Tigress-0-Challenge-0.py [+] Convertir expresiones simbólicas a un módulo LLVM ... [+] Módulo LLVM escribió en LLVM_EXpressions/Tigress-0-Challenge-0.ll [+] Recompiendo binarias desobfuscadas ... [+] Binario desobfuscado recompilado: Deobfuscated_Binaries/Tigress-0-Challenge-0.Deobfuscated
Luego, se pueden encontrar expresiones simbólicas aquí, las representaciones LLVM se pueden encontrar aquí y se pueden encontrar binarios recompilados aquí.
Usando Docker:
$ git clone [email protected]: jonathansalwan/tigress_protection.git $ CD/Path/To/Tigress_Protection $ Docker Build -T Image_Tigress_Protection. $ Docker Run -V/Path/To/Tigress_Protection:/root/tigress_protection -ti --name = tigress_protection --ulimit = 'stack = -1: -1' image_tigress_protection
Prueba dentro del contenedor Docker
# CD ~/Tigress_Protection # ./solve-vm.py tigress-challenges/tigress-0-challenge-0
A medida que simplificamos y recompilamos nuevos binarios, debemos proporcionar el mismo comportamiento de los binarios originales. Entonces, para probar nuestras versiones binarias usamos este script.
$ ./scripts/testing_equality.py ./tigress-challenges/tigress-0-challenge-0 ./deobfuscated_binaries/tigress-0-challenge-0.deobfuscated [...] [+] Éxito con 272966812638982633 [+] Éxito con 2304147855662358786 [+] Éxito con 15697842028176298504 [+] Éxito con 15273138908025273913 [+] Éxito con 17329851347176088980 [+] Éxito con 12160831137213706322 [+] Éxito con 3489058267725840982 [+] Éxito con 6474275930952607745 [+] Éxito con 7363567981237584398 [+] Éxito con 3685039181436704621 [+] Éxito: 100.00
Básicamente, este script ejecuta los binarios ofuscados y desobfusados con entradas y verificaciones aleatorias si tienen los mismos resultados de salida.

Con respecto a la tabla de proporciones, después de los desafíos de la tigresa resuelta, le pedimos a Christian Collberg las fuentes de sus desafíos para comparar el tamaño de las fuentes originales y nuestras versiones devirtualizadas. Tenga en cuenta que a pedido de Christian, no podemos proporcionar fuentes de los desafíos de la tigresa, si desea estas fuentes, por favor, pídale directamente :).
También recogimos 20 algoritmos hash (10 bien conocidos, 10 del desafío de la tigresa) y protegimos cada uno de estos algoritmos utilizando 46 protecciones de tigresa diferentes (ver Sext Section). Al final, tenemos un banco de prueba de 920 binarios protegidos. Cada uno de estos binarios protegidos se ha desvirtualizado con éxito utilizando el script solve-vm.py . Estos algoritmos hash se pueden encontrar en el directorio de muestras y sus versiones devirtualizadas en el directorio Deobfuscated_Binaries. La siguiente tabla es un resumen de nuestros resultados con respecto a nuestras 920 muestras.

Para obtener más información sobre estas opciones, consulte las páginas 1 y 2.