Win32 और कर्नेल दुरुपयोग तकनीकें पेंटेस्टर्स के लिए
पेंटेस्टर्स और रेड-टीमर्स के लिए Win32 और कर्नेल दुरुपयोग तकनीकें, @UVision और @RistBS द्वारा निर्मित
डेव मोड सक्षम है, किसी भी मदद के लिए खुला है :)
DOS_HEADER : PE का पहला हेडर, इसमें MS DOS संदेश ("This programm cannot be run in DOS mode...."), MZ हेडर (PE की पहचान के लिए मैजिक बाइट्स) और कुछ स्टब सामग्री होती है।IMAGE_NT_HEADER : इसमें PE फ़ाइल सिग्नेचर, फ़ाइल हेडर और वैकल्पिक हेडर होते हैंSECTION_TABLE : इसमें सेक्शन हेडर होते हैंSECTIONS : हेडर नहीं है लेकिन जानना उपयोगी है : ये PE के सेक्शन हैंविवरण : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266
IAT और ILT पूर्ण एड्रेस प्राप्त करने के लिए सरल PE पार्सिंग:
GetModuleHandleA(NULL);BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew (RVA NT_HEADER)OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]IMAGE_DATA_DIRECTORY.VirtualAddress (RVA IMAGE_IMPORT_DIRECTORY का)BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress (RVA IMAGE_IMPORT_DESCRIPTOR का)EAT उन सभी फ़ंक्शनों को रिज़ॉल्व करता है जो PE द्वारा एक्सपोर्ट किए जाते हैं और DLL को भी रिज़ॉल्व करता है। यह 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;
कृपया ध्यान दें कि EAT एक DLL में परिभाषित होता है, न कि "वास्तविक" PE में (एक PE लोड किए गए DLL के EAT का उपयोग उन पॉइंटर्स को हल करने के लिए करता है जिन फ़ंक्शनों को वह उपयोग करना चाहता है)।
### फ़ंक्शन एड्रेस रिज़ॉल्व करें
**फ़ंक्शन एड्रेस का उपयोग करना**
आप किस बात का इंतज़ार कर रहे हैं ? इस फ़ंक्शन को खोजें !
**ऑर्डिनल नंबर का उपयोग करना**
एक ऑर्डिनल नंबर `AddressOfFunctions` ऐरे में संबंधित फ़ंक्शन एड्रेस के लिए एक **इंडेक्स पोज़िशन** है। इसका उपयोग **फ़ंक्शन का सही एड्रेस प्राप्त करने** के लिए किया जा सकता है, जैसा नीचे दिया गया है :
आइए दिए गए ऑर्डिनल नंबर 3 के साथ संबंधित एड्रेस (Addr4) खोजने का प्रयास करें।
- **AddressOfFunctions** : *Addr1 Addr2 Addr3 Addr4 .... AddrN*
- **AdressOfNameOrdinals** : *2 5 7 3 ... N*
जिस एड्रेस की हम तलाश कर रहे हैं वह तीसरे स्थान पर है (0 से), और हमारा ऑर्डिनल नंबर इस एड्रेस के **इंडेक्स** के अनुरूप है।
**फ़ंक्शन नाम का उपयोग करना**
AddressOfNames ऐरे का Nवां तत्व AddressOfNameOrdinals ऐरे के Nवें तत्व के अनुरूप है : दिए गए नाम का उपयोग करके, आप संबंधित ऑर्डिनल नंबर प्राप्त कर सकते हैं, और इस नंबर का उपयोग करके फ़ंक्शन एड्रेस खोजने के लिए आगे बढ़ सकते हैं।