Win32 et techniques d’abus du noyau pour pentesters
Techniques d'abus de Win32 et du noyau pour pentesters et red-teamers réalisé par @UVision et @RistBS
Mode dev activé, ouvert à toute aide :)
DOS_HEADER : Premier en-tête du PE, contient le message MS DOS ("This programm cannot be run in DOS mode...."), l'en-tête MZ (octets magiques pour identifier le PE) et du contenu stub.IMAGE_NT_HEADER : Contient la signature du fichier PE, l'en-tête de fichier et l'en-tête optionnelSECTION_TABLE : Contient les en-têtes de sectionsSECTIONS : Pas un en-tête mais utile à savoir : ce sont les sections du PEDétails : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266
Analyse simple du PE pour récupérer l'adresse absolue de l'IAT et de l'ILT :
GetModuleHandleA(NULL);BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew (RVA de NT_HEADER)OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] de PIMAGE_NT_HEADERIMAGE_DATA_DIRECTORY.VirtualAddress (RVA de IMAGE_IMPORT_DIRECTORY)BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress (RVA de IMAGE_IMPORT_DESCRIPTOR)L'EAT résout toutes les fonctions exportées par le PE et résout également les DLL. Elle est définie dans la structure IMAGE_EXPORT_DIRECTORY :```c
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name; // name of DLL
DWORD Base; // first ordinal number
DWORD NumberOfFunctions; // number of entries in EAT
DWORD NumberOfNames; // number of entries in (1) (2)
DWORD AddressOfFunctions; // RVA EAT and contains also RVA of exported functions
DWORD AddressOfNames; // Pointer array contains address of function names
DWORD AddressOfNameOrdinals; // Pointer array contains address of ordinal number of functions (index in AddressOfFunctions)
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
Veuillez noter que l'EAT est définie dans une DLL, et non dans un « vrai » PE (un PE utilisera l'EAT d'une DLL chargée pour résoudre les pointeurs vers les fonctions qu'il souhaite utiliser).
### Résoudre l'adresse d'une fonction
**En utilisant l'adresse de la fonction**
Qu'attendez-vous ? Trouvez cette fonction !
**En utilisant le numéro ordinal**
Un numéro ordinal est une **position d'index** correspondant à l'adresse de fonction dans le tableau `AddressOfFunctions`. Il peut être utilisé pour **récupérer l'adresse correcte de la fonction**, comme ci-dessous :
Essayons de trouver l'adresse correspondante (Addr4) avec le numéro ordinal 3 donné.