原帖是http://bbs.fishc.com/home.php?mod=space&uid=9&do=blog&id=638小甲鱼发的,看到验证过程实在搞不懂,压根不知道从哪里找起。如果有会的人能否载图一步步示范下,劳驾了{:1_1:}
证明过程: 1. 随便打开一个exe文件,内存中的KERNEL32.DLL基地址是不变的;
2. 获取PEB基地址, 0:000> dd fs:30 L1 003b:00000030 7ffd6000 看到了,7ffd6000
3. 获取PEB_LDR_DATA结构地址7ffd6000+0c peb的结构定义: ntdll!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 SpareBool : UChar +0x004 Mutant : Ptr32 Void +0x008 ImageBaseAddress : Ptr32 Void +0x00c Ldr : Ptr32 _PEB_LDR_DATA +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +0x014 SubSystemData : Ptr32 Void +0x018 ProcessHeap : Ptr32 Void +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION ...... 0:000> dd 7ffd6000+0c L1 7ffd600c 00181ea0 PEB_LDR_DATA-> 00181ea0
4. 获取InInitializationOrderModuleList的地址 说一下这个PEB_LDR_DATA,她是ntdll.dll中的undocumented的一个结构,PEB_LDR_DATA的结构定义: 0:000> dt _PEB_LDR_DATA +0x000 Length : Uint4B +0x004 Initialized : UChar +0x008 SsHandle : Ptr32 Void +0x00c InLoadOrderModuleList : _LIST_ENTRY +0x014 InMemoryOrderModuleList : _LIST_ENTRY +0x01c InInitializationOrderModuleList : _LIST_ENTRY +0x024 EntryInProgress : Ptr32 Void 0:000> dd 00181ea0+1c L1 00181ebc 00181f58 InInitializationOrderModuleList->00181f58
5. 获取kernel32的基地址 0:000> dd 00181f58+8 L1 00181f60 7c920000 7c920000就是了? check一下: 0:000> dd kernel32 L1 7c800000 00905a4d 啊!竟然不是啊,7c920000是ntdll.dll的,哈哈。
不过,算法命题仍然是正确的。因为在shellcode中模块列表的第一个就是kernel32了,当然可以通过镜像名称来check的,不过shellcode的空间不允许的,这就是shellcode的艺术了。我用来测试的exe恰好先加载了ntdll.dll。
|