Tecniche di abuso di Win32 e Kernel per pentester
Tecniche di abuso di Win32 e Kernel per pentester e red teamer create da @UVision e @RistBS
Modalità sviluppatore attiva, aperto a qualsiasi aiuto :)
DOS_HEADER : Prima intestazione del PE, contiene il messaggio MS DOS ("This programm cannot be run in DOS mode...."), l'intestazione MZ (byte magici per identificare il PE) e del contenuto stub.IMAGE_NT_HEADER : Contiene la firma del file PE, il File Header e l'Optionnal HeaderSECTION_TABLE : Contiene le intestazioni delle sezioniSECTIONS : Non è un'intestazione ma è utile sapere: queste sono le sezioni del PEDettagli : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266
Semplice parsing del PE per recuperare l'indirizzo assoluto di IAT e ILT:
GetModuleHandleA(NULL);BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew (RVA NT_HEADER)OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] di PIMAGE_NT_HEADERIMAGE_DATA_DIRECTORY.VirtualAddress (RVA di IMAGE_IMPORT_DIRECTORY)BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress (RVA di IMAGE_IMPORT_DESCRIPTOR)L'EAT risolve tutte le funzioni esportate dal PE e risolve anche le DLL. È definita nella struttura 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;
Si noti che l'EAT è definita in una DLL, non in un PE "reale" (un PE userà l'EAT di una DLL caricata per risolvere i puntatori alle funzioni che vuole utilizzare).
### Risolvere l'indirizzo di una funzione
**Tramite l'indirizzo della funzione**
Che aspetti? Trova questa funzione!
**Tramite il numero ordinale**
Un numero ordinale è un **indice di posizione** che individua l'indirizzo di funzione corrispondente nell'array `AddressOfFunctions`. Può essere usato per **recuperare l'indirizzo corretto della funzione**, come di seguito:
Proviamo a trovare l'indirizzo corrispondente (Addr4) con il numero ordinale 3.
- **AddressOfFunctions** : *Addr1 Addr2 Addr3 Addr4 .... AddrN*
- **AdressOfNameOrdinals** : *2 5 7 3 ... N*