拿到这个题首先运行了一下,弹出了一个窗口,点确定就结束了,
要想输入产生溢出,显然要从它生成的exploit.dat入手。
在exploit.dat中输入了很长的”1111…”,然后又运行了程序,没有任何问题发生,看来要用OD分析汇编代码了。跟着代码单步调试,看到了如下图
如果没有exploit.dat,程序则创建了exploit.dat,判断文件大小,如果高于0x200,则直接跳到最后,跳过了读文件这一步,看来构造的字符串要小于0x200,本着越长越可能发生溢出的想法,那我就输入200个‘1‘,可还是什么事情也没发生。那就接着分析程序,F8走啊走,走到了这一步,让我看到了希望,
在一个不起眼的夹缝里还有一条判断文件大小的语句,如果高于0x84同样跳转,原来是这样,那我把文件里的‘1‘减去许多后运行发现程序还是正常的跑,当我把‘1’增加到81个时,出现了下图
说明我覆盖了程序中的指令,终于找到了可以干扰程序的点了,于是仔细分析代码,
通过ReadFile函数将数据读入buffer中,然后将buffer内容写入内存,如图
然后又将该数据写入栈地址为18fc40处,而在18fcc0处则存放着指向MessageBoxA地址的地址,如果输入数据大于0x80,则该地址被覆盖,找到了覆盖点就可以构造shellcode了,
由于覆盖的内容是地址的地址,所以最后三个字节是shellcode入口地址的地址,
最后三个字符覆盖地址,获得程序执行权后指向shellcode开头的0018fc44,0018fc44指向其下一条,这之后便是真正的shellocde,弹出一个对话框,
33DB xor ebx,ebx
53 push ebx
6865737300 push 'ess'
6873756363 push 'succ'
686F697420 push 'oit '
684578706C push 'Expl'
8BC4 mov eax,esp
53 push ebx
50 push eax
50 push eax
53 push ebx
B8AEFEB576 push eax 0x40116c
FFD0 call eax
83C414 add esp,0x14 //维持栈平衡
C3 retn
这是程序执行时的shellcode,设计这个shellocde时考虑如何获得这个MessageBoxA的地址,0x84的空间放不下动态获得API函数的shellcode,正好在程序中是通过动态方式获得的函数地址,并且把该地址存入了内存中,就是这个0x408514这个位置,正好拿来用喽。
再次运行程序,就出来了题目要求的形式。