我的思路是这样的:
1.在exe文件中添加新节,然后更改OEP,让它指向我的那部分代码,然后返回到OldEp.
但是在我的shellcode里面首先要找到Kernel32.dll的地址,然后得到GetProcAddress的函数地址,然后再LoadLibraryA("User32.dll"),再得到MessageBoxA的函数地址。
现在我的问题是 :
如果这个目标.exe里面本身启动了User32.dll的话,我的shellcode执行正确,但是如果目标.exe没有启动User32.dll的话,那么shellcode在LoadLibraryA("User32.dll")的时候会给eax的返回值为0,为什么会这样呢?
下面是我的shellcode:
MOV EAX,DWORD PTR FS:[30H] ;FS:[30H]指向PEB
MOV EAX,DWORD PTR [EAX+0CH] ;获取PEB_LDR_DATA结构的指针
MOV EAX,DWORD PTR [EAX+1CH] ;获取LDR_MODULE链表表首结点的inInitializeOrderModuleList成员的指针
MOV EAX,DWORD PTR [EAX] ;LDR_MODULE链表第二个结点的inInitializeOrderModuleList成员的指针
MOV EAX,DWORD PTR [EAX+08H] ;inInitializeOrderModuleList偏移8h便得到Kernel32.dll的模块基址
MOV EBP,EAX ; 将Kernel32.dll模块基址地址放至kernel中
MOV EAX,DWORD PTR [EAX+3CH] ;指向IMAGE_NT_HEADERS
MOV EAX,DWORD PTR [EBP+EAX+120] ;指向导出表
MOV ECX,[EBP+EAX+24] ;取导出表中导出函数名字的数目
MOV EBX,[EBP+EAX+32] ;取导出表中名字表的地址
ADD EBX,EBP
PUSH WORD PTR 0X00 ;构造GetProcAddress字符串
PUSH DWORD PTR 0X73736572
PUSH DWORD PTR 0X64644163
PUSH DWORD PTR 0X6F725074
PUSH WORD PTR 0X6547;空压栈16
MOV EDX,ESP
PUSH ECX
F1:
MOV EDI,EDX
POP ECX
DEC ECX
TEST ECX,ECX
JZ EXIT
MOV ESI,[EBX+ECX*4]
ADD ESI,EBP
PUSH ECX
MOV ECX,15
REPZ CMPSB
TEST ECX,ECX
JNZ F1;F1过程为查找GetProcAddress的地址
POP ECX
MOV ESI,[EBP+EAX+36] ;取得导出表中序号表的地址
ADD ESI,EBP
MOVZX ESI,WORD PTR[ESI+ECX*2] ;取得进入函数地址表的序号
MOV EDI,[EBP+EAX+28] ;取得函数地址表的地址
ADD EDI,EBP
MOV EDI,[EDI+ESI*4] ;取得GetProcAddress函数的地址
ADD EDI,EBP
PUSH WORD PTR 0X00 ;构造LoadLibraryA字符串
PUSH DWORD PTR 0X41797261
PUSH DWORD PTR 0X7262694C
PUSH DWORD PTR 0X64616F4C//空压栈14
PUSH ESP
PUSH EBP
CALL EDI ;调用GetProcAddress取得LoadLibraryA函数的地址,
;EAX存放的是LoadLibrary函数的地址
PUSH WORD PTR 0X00 ;构造字符串,测试新增节后的EXE是否能正常加载User32.dll
PUSH DWORD PTR 0X6C6C642E
PUSH DWORD PTR 0X32334944
PUSH WORD PTR 0X7355//空压栈12
PUSH ESP
CALL EAX
TEST EAX,EAX ;如果没有正确加载User32.dll的话,那么就直接退出
JE EXIT
ADD ESP,42 ;如果不这么做的,可能会发生堆栈溢出的问题。
PUSH DWORD PTR 0x0041786F
PUSH DWORD PTR 0x42656761
PUSH DWORD PTR 0x7373654D
PUSH ESP
PUSH EAX
CALL EDI
MOV EDI,EAX
MOV EAX,ESP
PUSH 0
PUSH EAX
PUSH EAX
PUSH 0
CALL EDI
SUB ESP,30 ;平衡堆栈,关于这边平衡堆栈的问题
EXIT: ADD ESP,42 ;平衡堆栈,关于这边平衡堆栈的问题
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课