前天去上海比赛,有个CCProxy的溢出题目,当时现场没能调出来,回来后,发现其实是线程的栈空间分配的问题,也就是说:当用OD打开和用OD附加时,线程分配的堆栈地址是不一样的。关于线程的堆栈的关系,不清楚的同学可以网上搜搜资料。现在给出解题过程:
这个软件在网上有POC,大家可以去看看,或者用msf实验一遍:
http://www.exploit-db.com/exploits/16689/
同样先用ollydbg 打开CCProxy.exe, 按F9运行,查看导入表,找到相关的Socket函数:
跟进,加上断点:
然后用python发送数据,根据exploit-db上给出的代码可知,登录CCproxy telnet后,ping 一个超长的字符串而导致溢出,
s = socket(AF_INET, SOCK_STREAM)
host = "192.168.10.128"
port = 23
s.connect((host, port))
s.send('p '+'A'*1016+'\r\n')
发送后,按F9,发现程序出错。长度先根据exploit-db上给出的,之后再分析。
再次用OD打开,发送,在WSARecv处停下,然后跟进,由于程序太大了,用IDA静态分析一遍,看看程序执行的流程,
找到相关的函数为:00417260
执行到这个函数,经过多次的跟进,在执行sub_4124E0后溢出,接着,跟进去,到004304A0 处:
这个函数是执行ping 命令后的返回结果用的,ida看看此函数,
name为传进来的host字段,也就是说我们传进来的 AAAAAAAAAA......... 字段
而buf字段只有0x404 的空间,也就是说这里就是溢出点,但是实际情况要自己观察堆栈:
sprintf函数执行前后堆栈的变化:
也就是说我们把013A66F0处覆盖成我们需要的地址就里成功就差不多了。
溢出分析到这里就差不多了,shellcode有几个坏字节'\x00\x07\x08\x0a\x0d\x20'编码一下就行了。
测试环境为:win xp3,DEP未开启。
本篇文章没什么技术含量,仅仅是重现下漏洞而已,大牛勿喷。