闲来逛逛milw0rm.
找到一个Cain Overflow Exploit.
见http://www.milw0rm.com/exploits/7309
为熟练自己的调试技巧特来分析以下。
针对Cain & Abel <= v4.9.24(其他的我没式,毕竟我只是分析漏洞而不只找漏洞)

作者使用的系统为SP3,所以在PERL脚本中看到。 XP SP3:  0x7c9d30d7       jmp esp
如果你知道著名的中文Win2000、XP、Win2003的JMP ESP通用跳转地址,那么你一定会把他改成7ffa4512。 

击CAIN点击工具栏上"Remote Password Decoder Dialog" 按钮。打开生成的s.rdp,一个计算器弹了出来。

好了我们现在来调试。
为了不让一调试就执行SHELLCODE,我们把SHELLCODE开头加几个CC(INT3断点)。
载入0D ,不分析,F9运行,一个异常,SHIFT+F9过。同理点按钮.又一个异常,SHIFT+F9过。打开S.RDP。准确中断到CC处.
已经执行到SHELLCODE了,现在我们需要知道到底是从哪来的。
查看堆栈。全覆盖成了414141,而且再往下拉一点就是当前的EIP。
可见,溢出原理是堆栈被某函数覆盖,然后跳到堆栈执行堆栈内的SHELLCODE。
所以,我们考虑对0012eed4下内存写入断点(这里被覆盖成7ffa4512后面是4141...+shellcode).

重新载入。再打开s.rdp前,停下。乘此机会,我们下0012eed4的内存写入断点.再按shift+F9断了下来。接下来单步的走饼时刻留意内存数据窗口0012eed4的变化。没走几下,
00474EDD    E8 DA821400     call    005BD1BC
00474EE2    83C4 18         add     esp, 18
00474EE5    85C0            test    eax, eax
00474EE7    0F84 81010000   je      0047506E

内存被刷的一下 覆盖了。看来,问题就在这个CALL里。

再来过。
这次我们F7到CALL里。
可以看堆栈内的参数

2000h      ;十进制8192缓冲区长度
0012cec8   ;要写入的地址

稍微跟踪一下子程序。我们发现主要是一个循环
005BD1D9    FF4D 0C         dec     dword ptr [ebp+C]                ; 循环开始
005BD1DC    74 28           je      short 005BD206
005BD1DE    FF75 10         push    dword ptr [ebp+10]
005BD1E1    E8 DA930000     call    005C65C0
005BD1E6    0FB7C0          movzx   eax, ax
005BD1E9    3D FFFF0000     cmp     eax, 0FFFF
005BD1EE    59              pop     ecx
005BD1EF    74 0D           je      short 005BD1FE
005BD1F1    66:8906         mov     word ptr [esi], ax               ; 这里开始写入缓冲区
005BD1F4    46              inc     esi
005BD1F5    46              inc     esi
005BD1F6    66:3D 0A00      cmp     ax, 0A
005BD1FA    74 0A           je      short 005BD206
005BD1FC  ^ EB DB           jmp     short 005BD1D9


所以我们仔细看这段循环。
它不断的把ax里的数据写入地址0012cec8之后.长度是2000h(8192)


我们关心的0012eed4,因为他将被改写为jmp esp的地址。
未改写前
0012EED4  00474DDD    返回到 Cain.00474DDD 来自 Cain.00474E30
所以改写后子程序返回时候继续jmp esp
于是执行该地址后面的shellcode了。

现在exploit的流程非常清楚了,ax中的数据哪里来呢?
005BD1DE    FF75 10         push    dword ptr [ebp+10]
005BD1E1    E8 DA930000     call    005C65C0
这个call通过[ebp+10]01762f38获得数据,返回到eax里。
所以我门要跟进去看看到底怎么来的数据,为什么会允许过长的数据,覆盖缓冲区

稍微读一下发现第一次的call把rdp的数据读到了eax
文件读到
01764fa8---------01765f98
长度限制为1000且全是AAA。。饼不能造成溢出。
跟踪发现,这个call后来又会再次读饼更改读入缓冲区的内容。
有兴趣的细细跟一下吧。
因此:AAAAA--->7ffa4512+AAAA+shellcode+AAAA。
此后循环继续覆盖缓冲区,最终覆盖了返回地址0012eed4。产生溢出。

上传的附件 rdp.rar