|
Si vous voulez bloquer ce service sur vos fils RSS
Si vous voulez nous contacter ou nous proposer un fil RSS
Menu > Articles de la revue de presse : - l'ensemble [ tous | francophone] - par mots clé [ tous] - par site [ tous] - le tagwall [ voir] - Top bi-hebdo de la revue de presse [ Voir]
Demi-Reversing de l'IAT Par Geo's blogLe [2009-07-24] à 01:07:00
Présentation : Un post que j'ai fait sur Nibbles pour apporté ma modeste part. Je le poste ici quand même - sans me soucier des éventuels soucis de formatage. Source http nibbles.tuxfamily.org p 409 --------------------------------------------------------------------- L'IAT - ou Import Address Table - est une section souvent présente dans les fichiers exécutables windows structurés par le format PE. Pour les connaisseurs, on peut la trouver sous le nom de .idata voire de .rdata . Il existe des techniques de piratage de cette section, comme le hooking IAT que je n'expliciterai malheureusement pas, n'ayant pas encore les connaissances requises pour . Dans les fichiers exécutables, les sections sont des blocs de données regroupés par utilisation. On a généralement .text la section code de notre fichier exécutable, où se retrouvent les instructions séquentielles qui seront exécutées par le processeur du binaire pur, donc .data la section qui contient, en vrac, des données au préalable initialisées à notifier que, dans la section .code, l'algorithme généré par le compilateur va se démerder pour adresser ses données .bss la section qui contient des données non-initialisées généralement présente sous des octets nuls, l'algorithme présent dans la section .code va pouvoir y stocker des données .idata la section importations , que nous allons étudier sans déconner . Nous allons, tout d'abord, définir ce qu'est la section importation je dirai IAT par la suite , étudier son intérêt, pour enfin passer à un peu de pratique pour faire joujou avec Demi-Reversing car on a des données théoriques, et parce qu'on va faire de la pratique . J'oubliais de préciser il faut connaître un minimum le format PE pour assurer une plus ou moins bonne compréhension de l'article. IAT C'est quoi, ça ------------------------- Littéralement, Import Address Table. Cette section a sa fonction particulière elle consiste à regrouper le nom des fonctions dynamiques - si je puis dire - présente dans les DLL - kernel32.dll, user32.dll... - afin de pouvoir les utiliser dans le programme. Par exemple, beaucoup de programmes auront besoin de la fonction ExitProcess , programmée dans la bibliothèque kernel32.dll . Il va donc falloir préciser dans l'IAT que l'on aura besoin de cette fameuse fonction. Pourquoi Parce que c'est la vie et tu la boucles les fonctions sont adressées différemment en fonction des systèmes d'exploitation, que ce soit Windows XP ou Windows Vista 32 bits, dans nos futurs exemples . Si les adresses étaient toutes les mêmes, on n'aurait pas besoin de préciser le nom des fonctions à importer. Leur adresse aurait suffit. Qui va trouver les adresses, alors Le loader de Windows, tout simplement. Lorsque ce loader va charger votre programme en mémoire, il va aller chercher les adresses des fonctions dont il a trouvé le nom, et va écrire ces adresses dans la section IAT. L'endroit de l'écriture est défini lui-même dans la section IAT. Tout est paramétré dedans. Nous allons l'étudier. Structure de l'IAT ------------------ Pour la suite, nous allons nous servir d'un binaire basique qui ne fait qu'afficher Hello . Vous pouvez l'obtenir à cette adresse http nibbles.tuxfamily.org wp-content uploads 2009 07 hello.exe L'IAT commence toujours par des structures de type _IMPORT_DESCRIPTOR . Sa définition est la suivante include typedef struct __IMPORT_DESCRIPTOR union DWORD Characteristics 0 for terminating null import descriptor DWORD OriginalFirstThunk RVA to original unbound IAT P_THUNK_DATA DWORD TimeDateStamp 0 if not bound, -1 if bound, and real date time stamp in _DIRECTORY_ENTRY_BOUND_IMPORT new BIND O.W. date time stamp of DLL bound to Old BIND DWORD ForwarderChain -1 if no forwarders DWORD Name DWORD FirstThunk RVA to IAT if bound this IAT has actual addresses _IMPORT_DESCRIPTOR typedef _IMPORT_DESCRIPTOR UNALIGNED P_IMPORT_DESCRIPTOR Énumérons, un à un, les membres de cette structure Characteristics OriginalFirstThunk DWORD, donc 4 octets il s'agit d'une adresse virtuelle relative - se référer à l'ImageBase dans l'en-tête PE pour récupérer l'adresse virtuelle absolue - indiquant un pointeur vers le tableau des fonctions à importer. Ces fonctions sont définies par la structure suivante include typedef struct __IMPORT_BY_NAME WORD Hint BYTE Name 1 _IMPORT_BY_NAME, P_IMPORT_BY_NAME Avec - Hint WORD 2 octets le numéro identifiant de la fonction. Il n'est pas explicitement valide, et sert à titre indicatif pour le loader windows - Name Byte 1 octet le nom de la fonction. On ne se servira pas de ce membre de structure pour obtenir le nom de la fonction sa taille est inconnue, tant la chaîne de caractère se termine de toute évidence par un octet nul. TimeDataStamp DWORD 4 octets indique la date de création du fichier. Ce membre ne contient pas forcément une valeur valide 0 dans plusieurs cas ForwarderChain DWORD 4 octets un champ qu'on voit souvent à 0. J'ai essayé de me renseigner sur Google, je n'ai vu que des c'est un truc avancé, on en parlera après , alors qu'il n'en parlent jamais. De ce fait, on va oublier ce champ puisqu'il ne gênera pas pour la suite Name DWORD 4 octets adresse virtuelle relative codée sur 4 octets et qui pointe sur une chaîne de caractère terminée par un octet nul. Cette chaîne correspond au nom de la DLL dont les fonctions proviennent FirstThunk à peu près pareil que OriginalFirstThunk. Je dis bien à peu près , parce qu'il m'est plus fiable lors de la manipulation de l'IAT sur plusieurs exécutables différents. On ne connait pas exactement le nombre de structures _IMPORT_DESCRIPTOR . On sait juste que la dernière structure contient tout ses membres non-initialisés donc 0 . Grâce au membre OriginalFirstThunk, on va pouvoir pointer sur un lot d'adresses virtuelles relatives qui correspondent à des pointeurs sur des structures _IMPORT_BY_NAME . On ne connait pas le nombre exact de structures présentes il faut simplement s'arrêter jusqu'à ce qu'on tombe sur une adresse virtuelle relative égale à 0. Grâce à ça, on va pouvoir connaître les fonctions importées de la DLL. Le champ FirstThunk - le dernier de la structure - quant à lui, lorsque le programme est chargé en mémoire, pointe sur un lot d'adresses virtuelles qui correspondent aux adresses mémoires des fonctions. Ce sont ses adresses qui seront appelées par le programme dans la section .text ou CODE pour les programmes compilés avec un environnement Borland . Prenons notre désassembleur favori ollydbg. Ouvrons notre exécutable hello.exe , faisons Alt M ou View Memory et cliquons sur. Vous avez ça caption id align aligncenter width 444 caption OllyDbg visualisation de l'IAT OllyDbg visualisation IAT caption J'ai tracé, en rouge, le chemin engendré par les pointeurs pour arriver au nom de la première fonction importée par le programme. Notez bien que les adresses mémoires sont écrites à l'envers, car c'est comme ça que sont représentés les entiers en dur dans la mémoire. On a donc, en fin de trajet, le Hint de la fonction ainsi que son nom, encadrés en bleus. En vert, j'ai tracé le chemin pour mettre en évidence le pointage vers la DLL Kernel32.dll. Voyons maintenant vers quoi pointe FirstThunk au lieu de OriginalFirstThunk caption id attachment_413 align aligncenter width 444 caption OllyDbg visualisation de l'IAT OllyDbg visualisation de l'IAT caption Ce champ pointe vers les adresses mémoires des fonctions. Pour être sûr de ce que j'avance, je vais utiliser arwin pour vérifier que la fonction AddAtom ait bien l'adresse 0x7C835535. Vous pouvez télécharger l'utilitaire ici http nibbles.tuxfamily.org wp-content uploads 2009 07 arwin.exe en voici son code source include include arwin - win32 address resolution program by steve hanna v.01 vividmachines.com shanna uiuc.edu you are free to modify this code but please attribute me if you change the code. bugfixes additions are welcome please email me to compile you will need a win32 compiler with the win32 SDK this program finds the absolute address of a function in a specified DLL. happy shellcoding int main int argc, char argv HMODULE hmod_libname FARPROC fprc_func printf arwin - win32 address resolution program - by steve hanna - v.01 n if argc arwin.exe kernel32.dll AddAtomA arwin - win32 address resolution program - by steve hanna - v.01 AddAtomA is located at 0x7c835535 in kernel32.dll On en déduit que le loader a bien placé l'adresse des fonctions dans la table d'importations. Un peu de prog ---------------- Depuis quelques temps, je bosse sur une bibliothèque pour me permettre d'analyser et manipuler le format PE de sorte à mieux le cerner. Je vais vous communiquer trois sources main.c prog principal , pe.h définitions de fonctions et pe.c les fonctions . main.c include include include include pe.h int main int argc, char argv if argc fp fopen filename, rb if MyPe-fp printf Erreur lors de l'ouverture de pourcentss abandon. n , filename return -1 DWORD MagicWord Lecture de l'en-tête DOS fread MyPe-ImageDosHeader, sizeof _DOS_HEADER , 1, MyPe-fp Déplacement jusqu'à l'en-tête PE fseek MyPe-fp, MyPe-ImageDosHeader.e_lfanew, SEEK_SET Lecture du mot magique fread MagicWord, sizeof DWORD , 1, MyPe-fp Lecture de l'en-tête PE fread MyPe-ImageFileHeader, sizeof _FILE_HEADER , 1, MyPe-fp Est-ce bien un PE if MagicWord _NT_SIGNATURE return -2 L'en-tête optionnelle existe if MyPe-ImageFileHeader.SizeOfOptionalHeader 0 On la lit fread MyPe-ImageOptionalHeader, sizeof _OPTIONAL_HEADER , 1, MyPe-fp On va lire toutes les sections MyPe-ImagesSectionHeader P_SECTION_HEADER malloc MyPe-ImageFileHeader.NumberOfSections sizeof _SECTION_HEADER int i for i 0 i ImageFileHeader.NumberOfSections i fread MyPe-ImagesSectionHeader i , sizeof _SECTION_HEADER , 1, MyPe-fp return 1 Cette fonction affiche les en-têtes de chaque section. param MyPe PortableExecutable structure PortableExecutable VOID PE_DmpSectionHeaders PortableExecutable MyPe int i 4 PE 0 0 fseek MyPe.fp, 4 MyPe.ImageDosHeader.e_lfanew sizeof MyPe.ImageFileHeader MyPe.ImageFileHeader.SizeOfOptionalHeader, SEEK_SET for i 0 i ImagesSectionHeader Cette fonction retourne l'offset - en dur dans le fichier - d'une section dont on connait le nom. param MyPe PortableExecutable structure PortableExecutable. param name char nom de la section DWORD Pe_GetOffsetFromSection PortableExecutable MyPe, char name int i 0 while strcmp MyPe.ImagesSectionHeader i .Name, name i PE.exe hello.exe KERNEL32.dll - AddAtomA - ExitProcess - FindAtomA - GetAtomNameA - SetUnhandledExceptionFilter msvcrt.dll - __getmainargs - __p__environ - __p__fmode - __set_app_type - _assert - _cexit - _iob - _onexit - _setmode - abort - atexit - free - malloc - memset - printf - signal Le code C est très crasseux et reste à améliorer, autant sur la revue des algos que sur l'ajout de nouvelles fonctionnalités. Vous pouvez obtenir l'archive contenant sources exécutable fichier projet Code Blocks ici http nibbles.tuxfamily.org wp-content uploads 2009 07 PE.zip Conclusion ---------- La section IAT reste intéressante en elle. Son fonctionnement est tel qu'elle puisse importer des fonctions de n'importe quelle DLL - tant qu'elle existe - sans en connaître ses adresses mémoires. Simplement ses noms. Il existe cependant d'autres méthodes pour faire appel à des fonctions sans passer par l'IAT, telles que l'utilisation des fonctions LoadLibrary et GetProcAddress . Liens 0vercl0k's blog. API Hooking - IAT patching premier sur Google, bravo à notre ami pendule 0vercl0k's blog. Dump Own iat., un article aux objectifs semblables. Toujours d'0vercl0k. Désolé pour les bavures sur le formatage des différents codes sources. L'archive reste normalement à disposition .
Les derniers articles du site "Geo's blog" :
- Comprendre ce à quoi servent __cdecl et __stdcall en langage C, ainsi que leurs différences - End. - Comment supporter __construct et __destruct en PHP 4 - Une bonne raison d'utiliser intval - Analyse de winpcap - Petite rectification - Fonctionnalités intéressantes dans notepad - Analyse de winpcap - Partie II - Analyse de winpcap - Partie I - Joujou avec winpcap - Réimport Ret into libc théorie pratique
Menu > Articles de la revue de presse : - l'ensemble [ tous | francophone] - par mots clé [ tous] - par site [ tous] - le tagwall [ voir] - Top bi-hebdo de la revue de presse [ Voir]
Si vous voulez bloquer ce service sur vos fils RSS :
- avec iptables "iptables -A INPUT -s 88.191.75.173 --dport 80 -j DROP"
- avec ipfw et wipfw "ipfw add deny from 88.191.75.173 to any 80"
- Nous contacter par mail
Mini-Tagwall des articles publiés sur SecuObs : | | | | sécurité, exploit, windows, attaque, outil, microsoft, réseau, audit, metasploit, vulnérabilité, système, virus, internet, usbsploit, données, source, linux, protocol, présentation, scanne, réseaux, scanner, bluetooth, conférence, reverse, shell, meterpreter, vista, rootkit, détection, mobile, security, malicieux, engineering, téléphone, paquet, trames, https, noyau, utilisant, intel, wishmaster, google, sysun, libre |
Mini-Tagwall de l'annuaire video : | | | | curit, security, biomet, metasploit, biometric, cking, password, windows, botnet, defcon, tutorial, crypt, xploit, exploit, lockpicking, linux, attack, wireshark, vmware, rootkit, conference, network, shmoocon, backtrack, virus, conficker, elcom, etter, elcomsoft, server, meterpreter, openvpn, ettercap, openbs, iphone, shell, openbsd, iptables, securitytube, deepsec, source, office, systm, openssh, radio |
Mini-Tagwall des articles de la revue de presse : | | | | security, microsoft, windows, hacker, attack, network, vulnerability, google, exploit, malware, internet, remote, iphone, server, inject, patch, apple, twitter, mobile, virus, ebook, facebook, vulnérabilité, crypt, source, linux, password, intel, research, virtual, phish, access, tutorial, trojan, social, privacy, firefox, adobe, overflow, office, cisco, conficker, botnet, pirate, sécurité |
Mini-Tagwall des Tweets de la revue Twitter : | | | | security, linux, botnet, attack, metasploit, cisco, defcon, phish, exploit, google, inject, server, firewall, network, twitter, vmware, windows, microsoft, compliance, vulnerability, python, engineering, source, kernel, crypt, social, overflow, nessus, crack, hacker, virus, iphone, patch, virtual, javascript, malware, conficker, pentest, research, email, password, adobe, apache, proxy, backtrack |
|
|
|
|
|