Tigress est un virtualiseur / obfuscateur diversifiant pour le langage C qui soutient de nombreuses défenses nouvelles contre les attaques ingénieuses et dynamiques inverse et de désintératiisation. En particulier, la tigress protège contre la dé-virtualisation statique en générant des ensembles d'instructions virtuels de complexité et de diversité arbitraires, en produisant des interprètes avec plusieurs types d'envoi d'instructions et en insérant le code pour l'analyse anti-alias. Tigress protège contre la dé-virtualisation dynamique en fusionnant le code réel avec des fausses fonctions, en insérant un flux implicite, et en créant des interprètes réensembles-exécutants lentement. Tigress implémente sa propre version de l'emballage de code grâce à l'utilisation de la génération de code d'exécution. Enfin, la transformation dynamique de Tigress fournit une forme généralisée de modification du code d'exécution continue.
L'équipe de Tigress a posé certains défis où nous pouvons trouver différents types de protections
Tous les défis prennent en entrée un nombre et renvoient un hachage. Exemple:
$ ./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 fonction de calcul de hachage est obscurcie. Types d'attaques possibles:
Nos objectifs étaient de:
Et tout cela avec un seul script générique :). Pour ce faire, nous avons fait dans l'ordre suivant:
Si vous souhaitez plus d'informations, vous pouvez vérifier notre script Solve-VM.py.

Cependant, nous avons déjà poussé tous nos résultats dans ce référentiel, mais si vous voulez vous reproduire par vous-même cette analyse, vous n'avez qu'à exécuter solve-vm.py comme ceci:
$ ./solve-vm.py ./obfuscatecated_binaries/_binary_
Exemple:
$ ./solve-vm.py ./tigress-challenges/tigress-0-challenge-0 [+] Chargement 0x400040 - 0x400238 [+] Chargement 0x400238 - 0x400254 [+] Chargement 0x400000 - 0x400F14 [+] Chargement 0x601e28 - 0x602550 [+] Chargement 0x601e50 - 0x601fe0 [+] Chargement 0x400254 - 0x400298 [+] Chargement 0x400dc4 - 0x400e08 [+] Chargement 0x000000 - 0x000000 [+] Chargement 0x601e28 - 0x602000 [+] Accrocheur printf [+] Accrochez __libc_start_main [+] Accrocheur strtoul [+] Démarrage de l'émulation. [+] __libc_start_main Hrowed [+] argv [0] = ./tigress-challenges/tigress-0-challenge-0 [+] argv [1] = 1234 [+] strtoul accroché [+] Symbolisant le retour strtoul [+] printf accroché 3035321144166078008 [+] Trancher l'expression de l'utilisateur de point final [-] Instruction non prise en charge: 0x400539: HLT [+] Instruction exécutée: 39816 [+] Instruction unique exécutée: 458 [+] PC Len: 0 [+] Émulation faite. [+] Génération de symbolic_expressions / tigress-0-challenge-0.py [+] Conversion des expressions symboliques en un module LLVM ... [+] Le module llvm a écrit dans llvm_expressions / tigress-0-challenge-0.ll [+] Recompilation binaire désobfusée ... [+] Désobfuscated binaire recompilé: déobfuscated_binaries / tigress-0-challenge-0.deobfuscated
Ensuite, des expressions symboliques peuvent être trouvées ici, des représentations LLVM peuvent être trouvées ici et des binaires recompilés peuvent être trouvés ici.
Utilisation de 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 --umit = 'stack = -1: -1' image_tigress_protection
Tester à l'intérieur du conteneur Docker
# CD ~ / Tigress_protection # ./Solve-vm.py Tigress-Challenge / Tigress-0-Challenge-0
Comme nous avons simplifié et recompilé de nouveaux binaires, nous devons fournir le même comportement des binaires d'origine. Donc, pour tester nos versions binaires, nous utilisons ce script.
$ ./scripts/testing_equality.py ./tigress-challenge/tigress-0-challenge-0 ./deobfuscated_binaries/tigress-0-challenge-0.deobfuscated [...] [+] Succès avec 272966812638982633 [+] Succès avec 2304147855662358786 [+] Succès avec 15697842028176298504 [+] Succès avec 15273138908025273913 [+] Succès avec 17329851347176088980 [+] Succès avec 12160831137213706322 [+] Succès avec 3489058267725840982 [+] Succès avec 6474275930952607745 [+] Succès avec 7363567981237584398 [+] Succès avec 3685039181436704621 [+] Succès: 100,00
Fondamentalement, ce script exécute les binaires obscurs et désobfuscés avec des entrées aléatoires et vérifie si elles ont les mêmes résultats de sortie.

En ce qui concerne le tableau des rapports, après les défis de la tigresse résolu, nous avons demandé à Christian Colberg les sources de ses défis afin de comparer la taille des sources originales et nos versions déviptualisées. Notez qu'à la demande de Christian, nous ne pouvons pas fournir des sources de défis Tigress, si vous voulez que ces sources, veuillez lui demander directement :).
Nous prenons également 20 algorithmes de hachage (10 bien connus, 10 du défi Tigress) et nous avons protégé chacun de ces algorithmes en utilisant 46 protections de Tigress différentes (voir la section suivante). À la fin, nous avons un banc d'essai de 920 binaires protégés. Chacun de ces binaires protégés a été déviptualisé avec succès à l'aide du script solve-vm.py . Ces algorithmes de hachage peuvent être trouvés dans le répertoire des échantillons et leurs versions Deirttualized dans le répertoire Deobfuscatecatecated_binaries. Le tableau suivant est un résumé de nos résultats concernant nos 920 échantillons.

Pour plus d'informations sur ces options, consultez les pages 1 et 2.