A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 1/49 Déprotection semi-automatique de binaire avec : celui qui fond dans la bouche et pas dans la main. Alexandre Gazet Yoann Guillot
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 2/49 Plan 1 2 3 4
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 3/49 Plan Les désassembleurs classiques Binding Backtracing 1 Les désassembleurs classiques Binding Backtracing 2 3 4
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 4/49 Les désassembleurs classiques Binding Backtracing
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 5/49 Les désassembleurs classiques Binding Backtracing
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 6/49 Désassemblage Les désassembleurs classiques Binding Backtracing La référence : IDA Pro Excellent sur du code clair : binaire MS Inadapté sur un binaire protégé Pas d interprétation du code Des hypothèses trop contraignantes Des hypothèses Les deux branches d un saut conditionnel sont exécutées Deux instructions ne se superposent pas Un appel retourne
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 6/49 Désassemblage Les désassembleurs classiques Binding Backtracing La référence : IDA Pro Excellent sur du code clair : binaire MS Inadapté sur un binaire protégé Pas d interprétation du code Des hypothèses trop contraignantes Des hypothèses Les deux branches d un saut conditionnel sont exécutées Deux instructions ne se superposent pas Un appel retourne
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 7/49 Hypothèse : un appel retourne Les désassembleurs classiques Binding Backtracing. text :00403 E9F loc 403E9F : ; CODE XREF:.text:loc_40CDEF.text :00403 E9F push ebp.text :00403EA0 push ecx.text :00403EA1 push ebp.text :00403EA2 c a l l sub 40BECD.text :00403EA7 outsb.text :00403EA8 cmp edx, esp.text :00403EAA push esp.text :00403EAB inc esi
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 8/49 Mise en échec Les désassembleurs classiques Binding Backtracing. text :0040BECD sub 40BECD proc near ; CODE XREF:.text:00403EA2.text :0040BECD cmp eax, ebp.text :0040BECF add dword ptr [ esp +0], 1.text :0040BED4 test ebx, 1E2h.text :0040BEDA retn 0Ch.text :0040BEDA sub 40BECD endp
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 9/49 Binding Les désassembleurs classiques Binding Backtracing Définition Expression symbolique des effets d une instruction; à chaque instruction est associée sa sémantique. Instruction ADD : a = di. i nstruction. args.map res = Expression [ [ a [ 0], :&, mask ], :+, [ a [ 1], :&, mask ] ] binding [ : eflag z ] = Expression [ [ res, :&, mask ], :==, 0] binding [ : e fla g s ] = sign [ res ] binding [ : eflag c ] = Expression [ res, :>, mask ] binding [ : eflag o ] = Expression [ [ sign [ a [ 0 ] ], :==, sign [ a [ 1 ] ] ], : &&, [ sign [ a [ 0 ] ], :!=, sign [ res ] ] ] binding [ i n s t r ] ={ a [ 0 ] => res }
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 10/49 Binding Les désassembleurs classiques Binding Backtracing Instruction CALL : addrreturn = Expression [ Expression [ di. address, :+, di. bin length ]. reduce ] } binding = { : esp => Expression [ : esp, :, opsz ], I ndirection [ : esp, opsz, di. address ] => addrreturn } En pratique : dword ptr [ esp ] = 0x4010CE esp = esp 4 Instruction RDTSC : binding = { : eax => Expression : : Unknown, : edx => Expression : : Unknown }
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 10/49 Binding Les désassembleurs classiques Binding Backtracing Instruction CALL : addrreturn = Expression [ Expression [ di. address, :+, di. bin length ]. reduce ] } binding = { : esp => Expression [ : esp, :, opsz ], I ndirection [ : esp, opsz, di. address ] => addrreturn } En pratique : dword ptr [ esp ] = 0x4010CE esp = esp 4 Instruction RDTSC : binding = { : eax => Expression : : Unknown, : edx => Expression : : Unknown }
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 10/49 Binding Les désassembleurs classiques Binding Backtracing Instruction CALL : addrreturn = Expression [ Expression [ di. address, :+, di. bin length ]. reduce ] } binding = { : esp => Expression [ : esp, :, opsz ], I ndirection [ : esp, opsz, di. address ] => addrreturn } En pratique : dword ptr [ esp ] = 0x4010CE esp = esp 4 Instruction RDTSC : binding = { : eax => Expression : : Unknown, : edx => Expression : : Unknown }
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 11/49 Backtracing, la théorie Les désassembleurs classiques Binding Backtracing Définition Émulation symbolique par remontée du flot d instructions.
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 12/49 Backtracing, la pratique Les désassembleurs classiques Binding Backtracing Flot d exécution : c a l l loc 40becdh ; @403ea2h e826800000 cmp eax, ebp ; @40becdh 39 e8 add dword p tr [ esp +0], 1 ; @40becfh 8344240001 t e s t ebx, 1e2h ; @40bed4h f7c3e2010000 r e t 0ch ; @40bedah c20c00 Backtracing x dword ptr [esp] for 40bedah ret 0ch 1 backtrace 40becfh add dword ptr [esp+0], 1 dword ptr [esp] => dword ptr [esp]+1 2 backtrace up 40becdh->403ea2h dword ptr [esp]+1 3 backtrace 403ea2h call loc 40becdh dword ptr [esp]+1 403ea8h 4 backtrace result : 403ea8h
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 13/49 Les désassembleurs classiques Binding Backtracing Listing produit : loc 403e9fh : push ebp ; @403e9fh 55 push ecx ; @403ea0h 51 push ebp ; @403ea1h 55 c a l l loc 40becdh ; @403ea2h e826800000 noreturn db 6eh ; @403ea7h // Xrefs : 40bedah loc 403ea8h : cmp edx, esp ; @403ea8h 39 e2 push esp ; @403eaah 54 [... ] // Xrefs : 403ea2h loc 40becdh : cmp eax, ebp ; @40becdh 39 e8 add dword p tr [ esp +0], 1 ; @40becfh 8344240001 t e s t ebx, 1e2h ; @40bed4h f7c3e2010000 r e t 0ch ; @40bedah c20c00 x: loc_403ea8h
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 14/49 Plan Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection 1 2 Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection 3 4
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 15/49 Securitech 2006 - Challenge 10 Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Poeut.exe Binaire massivement obfusqué IDA dépassé désassemble parfaitement mais : Reordonnancement des blocs d instructions nécessité de développer un front-end graphique yed - Graph Editor Visualisation de graphes Utilise un fichier graphml Objets internes de les InstructionBlock
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 16/49 Graphe sauvage Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 17/49 Prédicats biaisés Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Prédicats obscurs La fonction prédicat renvoie toujours vrai ou toujours faux Prédicats résistants à une analyse manuelle/statique Une des deux branches n est jamais exécutée i f ( xˆ4 (x 5)ˆ2 >= 0){ goto real code ; } else{ goto no where ; } fstp qword ptr [ esp +8] fstp qword ptr [ esp ] c a l l thunk pow fstp qword ptr [ ebp 0x20 ] mov eax, dword ptr [ ebp 0ch ] sub eax, 5 push eax f i l d dword ptr [ esp ] lea esp, dword ptr [ esp+4] fld qword ptr [ xref 8048590h ] fstp qword ptr [ esp +8] fstp qword ptr [ esp ] c a l l thunk pow fld qword ptr [ ebp 20h ] fmulp ST(1)
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 18/49 Prédicats biaisés Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Aléa total La fonction prédicat renvoie indifféremment vrai ou toujours faux Les sémantiques des deux branches sont équivalentes i f ( rand () %2 ) { real code A ; } else { real code B ; }
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 19/49 Duplication de flot Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Insertion massive d aléa total : Constructions en diamant.
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 20/49 Éléments neutres Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Définition Instruction ou groupe d instructions ayant une sémantique nulle : aucun impact réel sur le contexte d exécution.
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 21/49 Éléments neutres : aléa apparent Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Implémentation : test esp, ebx ; @402039h 85e3 cmp ebx, edx ; @40203bh 39 d3 mov byte p tr [ edx ], a l ; @40203dh 8802 add dword p tr [ esp +0], 6 ; @40203fh 8344240006 inc edx ; @402044h 42 jmp loc 40b25dh ; @402045h e913920000 Réponse au problème Utilisation du binding des instructions Incohérences du data flow au niveau des flags : Deux écritures successives Écriture mais pas de lecture
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 22/49 Éléments neutres : faux appels Implémentation : Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection push eax ; @408dadh 50 push ecx ; @408daeh 51 push ebp ; @408dafh 55 [... ] c a l l loc 4037f2h ; @40932fh [... ] push esp ; @4037f4h 54 push ecx ; @4037f5h 51 [... ] add dword p tr [ esp +8], 9 ; @4037f9h 8344240809 add esp, 8 ; @403800h 83 c408 [... ] r e t 0ch ; @403808h c20c00 x: loc_40933dh Réponse au problème Création du flot d exécution Simulation d une pile Pattern particulier : modifie l adresse de retour
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 23/49 Épilogue brut Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 24/49 Analyse des flots d exécution Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Réponse au problème 1 Parcours de l arbre d objets internes InstructionBlock 2 Inline de fonction si nécessaire 3 Recherche de constructions en diamant 4 Création, nettoyage puis comparaison des flots 5 Factorisation si nécessaire
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 25/49 Épilogue avec flots factorisés Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 26/49 Épilogue réordonné Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 27/49 Vue finale Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 28/49 Touche finale Présentation Complexification du graphe de contrôle Insertion d éléments neutres Déprotection Nettoyage de tout le graphe du binaire Production d un listing assembleur propre Utilisation du compilateur compris dans pour produire un binaire dépourvu de la protection
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 29/49 Plan Introduction Obfuscation Machine virtuelle Résolution 1 2 3 Introduction Obfuscation Machine virtuelle Résolution 4
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 30/49 T2 2007 Introduction Obfuscation Machine virtuelle Résolution t207.exe http://www.t2.fi/challenge/ But : trouver un mot de passe pour deverouiller le programme Binaire très simple [demo/1] Charge un driver obfusqué [demo/2]
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 31/49 Désobfuscation Introduction Obfuscation Machine virtuelle Résolution Les types d obfuscation Junk code Opérations obfusquées Anti ring3 Duplication de code
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 32/49 Junk code Introduction Obfuscation Machine virtuelle Résolution junk ror edi, 0dh xchg ebx, edi ror ebx, 13h xchg ebx, edi
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 33/49 Opérations obfusquées Introduction Obfuscation Machine virtuelle Résolution rotation de bits push eax push ecx r o l dword ptr [ esp +4], c l pop ecx pop eax
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 34/49 Anti ring3 Introduction Obfuscation Machine virtuelle Résolution test ring0 pushfd push eax xor eax, eax mov ax, cs cmp eax, 9 j l e loc 131d5h rdtsc imul eax, ecx jmp eax ; x : unknown loc 131d5h : pop eax popfd
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 35/49 Duplication de code Introduction Obfuscation Machine virtuelle Résolution duplication push e s i push ebx pushfd rdtsc imul ecx, ebx cmp cl, 7 fh jnb loc 21aba popfd pop ebx pop e s i loc 21abah : popfd pop ebx pop e s i
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 36/49 Machine virtuelle Introduction Obfuscation Machine virtuelle Résolution Structure de handler Des opérations simples Des constructions similaires Opérations paramétrées par [ebp] [demo/3]
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 37/49 Addition virtuelle Introduction Obfuscation Machine virtuelle Résolution Handler d addition loc 15336 : mov ecx, dword p t r [ ebp+0ch ] x o r ecx, 842 b1208h mov ecx, dword ptr [ ebx+ecx ] mov eax, dword p t r [ ebp +8] x o r eax, 842 b1208h add dword ptr [ ebx+eax ], ecx
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 38/49 Transition entre handlers Introduction Obfuscation Machine virtuelle Résolution transition au handler suivant mov ecx, dword p t r [ ebp +0] xor ecx, 149 f0c63h mov ebp, dword ptr [ ebp+4] xor ebp, 842b1208h add ebp, dword ptr [ ebx+14h ] add ecx, dword p t r [ ebx+14h ] jmp ecx ; x : unknown
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 39/49 Architecture virtuelle Introduction Obfuscation Machine virtuelle Résolution handler mov eax, [ebp+8] xor eax, h1_key_2 mov [ebx+eax], 0 mov eax, [ebp] xor eax, h1_key_1 mov ebp, [ebp+4] xor ebp, h1_key_2 add eax, [ebx+14h] add ebp, [ebx+14h] jmp eax ciphered instruction next_handler next_instr arg0 key_1 key_2 handler mov eax, [ebp+8] xor eax, h2_key_2 mov ecx, [ebp+12] xor ecx, h2_key_2 mov ecx, [ebx+ecx] add [ebx+eax], ecx ciphered instruction next_handler next_instr arg0 key_1 key_2 arg1
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 40/49 Énumération des handlers Introduction Obfuscation Machine virtuelle Résolution Énumération directe impossible Nécessite de suivre le flot virtuel pas à pas La taille du binaire indique la présence de nombreux handlers Analyse comportementale de chaque handler par backtrack [demo/4]
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 41/49 Résultat de l analyse Introduction Obfuscation Machine virtuelle Résolution Binding du handler handler 13491h : // reg0 < Expression [ reg0, :+, reg1 ] // handler type : add reg, reg mov eax, dword p t r [ ebp+0ch ] xor eax, 8d3f5d8bh mov eax, dword ptr [ ebx+eax ] mov ecx, dword p t r [ ebp +8] xor ecx, 8d3f5d8bh add dword ptr [ ebx+ecx ], eax
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 42/49 Code virtuel basique Introduction Obfuscation Machine virtuelle Résolution Les premières instructions virtuelles entrypoint 219feh 21ea6h : nop mov r68, 28h add r68, host esp mov r64, dword ptr [ r68 ] mov dword ptr [ esp ], r64 mov r64, 4 add esp, r64 mov r68, 2ch add r68, host esp mov r64, dword ptr [ r68 ] mov dword ptr [ esp ], r64 mov r64, 4 add esp, r64 trap
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 43/49 Macro-instructions virtuelles Introduction Obfuscation Machine virtuelle Résolution Niveau d abstraction supérieur Reconnaissance de patterns caractéristiques Reconstruction d un assembleur plus haut niveau Apparition des fonctions (call, ret)
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 44/49 Macro-code virtuel Introduction Obfuscation Machine virtuelle Résolution Les premières instructions virtuelles entrypoint 219feh 21ea6h : mov dword ptr [ esp ], dword ptr [ host esp+28h ] add esp, 4 mov dword ptr [ esp ], dword ptr [ host esp+2ch ] add esp, 4 mov ebp, esp add esp, 234h mov r64, dword ptr [ ebp+200h ] xor r64, 1 j r z loc 2d630h 2d8ffh, r64 s y s c a l l a l l o c p t r r64, 0ch mov dword ptr [ ebp+200h ], r64 loc 2d630h 2d8ffh :
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 45/49 Décompilation Introduction Obfuscation Machine virtuelle Résolution La sémantique des instructions est très simple La forme du code fait penser à du C Vérifions
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 46/49 Validation Introduction Obfuscation Machine virtuelle Résolution Résolution purement statique
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 47/49 Plan 1 2 3 4
s générale A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 48/49 Poeut : application inverses de transformations Suppression d éléments neutres ajoutés. Factorisation de flots dupliqués, Réduction du graphe de contrôle, Niveau d abstraction constant. T2 : remontée des niveaux d abstraction Quelques millions d instructions dans un driver, une machine virtuelle, 112 handlers, 800 lignes de macro-assembleur, 300 lignes de C, Extraction progressive de la sémantique.
A. Gazet & Y. Guillot Déprotection semi-automatique de binaire 49/49 Remerciements L infâme Serpillierre, Le(s) concepteur(s) du T2. http://esec.fr.sogeti.com/blog Vos questions?