欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[分享][原创]PCMan FTP远程代码执行漏洞分析(CVE-2013-4730)

[分享][原创]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,触发漏洞

[图片:658861_mmfg4hb9kit9rok.jpg]

我们可以看出返回值被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

 


注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功