-
-
[分享][原创]PCMan FTP远程代码执行漏洞分析(CVE-2013-4730)
-
2017-4-14 23:06
5135
-
[分享][原创]PCMan FTP远程代码执行漏洞分析(CVE-2013-4730)
前言
刚转入二进制不久,拿网上大牛写过的帖子练手,发现网上方法:突破点都是在IDA中搜索recv,然后下断点,跟踪到异常处,发现触发漏洞地方。但是大部分我们分析漏洞程序,很难有这种,一开始就知道在关键函数下断点,等待断点触发的。大部分还是从POC异常触发点,然后一步一步回溯逆向到引发漏洞的关键函数的。分享一下不同的角度,感谢15PB给我带来不一样的世界,还记得任老师最后告诫我们的那句话:不要让你的技术超过你的人品。。
漏洞环境搭建与分析
https://www.exploit-db.com/exploits/26471/
环境 WindowsXP下 python 2.7.13
POC
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 21)) s.recv(1024) User = 'anonymous' Password='A'*8000 s.send("USER" + User + "\r\n") print s.recv(1024) s.send("PASS" + Password + "\r\n") print s.recv(1024) |
运行POC,触发漏洞
我们可以看出返回值被AAAA覆盖了,此时的esp之前应该就是返回值,所以我们可以在0012ed6c之前下硬件写入条件断点重新打开windbg 附加PCMan 用windbg下如下命令,此时我们只要关注堆栈返回值上面几处的值是否被覆盖了AAAA,等待断点命中
ba w4 0012ed5c ".if(poi(0012ed5c)=0x41414141){}.else{gc}"
运行POC可以看到在004173af断下,此时我们栈中,已经被A覆盖了大部分,但是返回值还没有被覆盖,我们可以看到
在IDA中定位此处的EIP看出此时在write_string函数中,调用write_char函数循环在向栈写内容
我们接着向上回溯看看调用此函数的是谁,windbg单步,或者gu执行到函数返回,在函数回溯过程中发现sprintf函数,F5查看,此时的sprintf函数后面带有%s,所以是有可能发生字符串溢出的
调用完sprintf函数过后,返回时,发现堆栈已经被AAAA覆盖了,我们可以在 sprintf处下断点验证,调用此函数前,和调用该函数过后,堆栈的情况,我们可知函数的返回值存放在0012ed68+4中
重新启动windbg 附加PCMan程序对 sprintf函数重点观察,调用前后堆栈变化,我们在IDA中可以看到sprintf参数的最后一个是讲字符串写入缓冲区中,没有进行长度限制,导致了堆栈破坏 而且ecx表明的是将要拷贝的字符串缓冲区
第一次拷贝
第二次拷贝
第三次拷贝
第四次拷贝
第五次拷贝
第六次拷贝
根据上面分析可知,sprintf共发生六次拷贝,其中前五次没有发生堆栈溢出,最后一次拷贝数据比较大,发生了溢出,然后EIP被修改为我们控制的地方,也就是AAAA
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法