也许你用过或者正在用着PP点点通这款软件,因为其出色的基于网络的服务功能,使得它在现在的网络软件中占据了很大的市场。我也是它的一个忠实用户,可就在几天前,我的朋友说他发现PP点点通这款软件有漏洞,而具体的细节他没有给我说,虽然只是简单的一句话,可是因为自己对这样的信息比较感兴趣,于是我就自己寻找出现漏洞的地方,所谓自力更生才是正道嘛。我拿出自己编写的一套测试软件,在脑力与程序的配合下,终于发现了出现漏洞的地方,其实要成功触发这个漏洞并不难,可难就难在找到利用的突破口上了,欲知详情请听下面分解。
        漏洞出现的地方是在对本地一个文件的修改上,这个文件名为“Config.ini”,顾名思义是一个配置文件。很多程序在初始化的时候都是要么从配置文件获取初始信息,要么从注册表获取信息等等,这一点对于安全测试员来说很关键。文件“Config.ini”中有很多可以测试的字段,我这里首先选择了“DownloadPath=”,因为这是一个可以被人明显注意的地方,一般在程序安装后,它的默认值是“C:\Program Files\PP31\Downloads”。我们知道,Windows默认的文件夹、文件完整路径不超过255个字节,而在VC6中有个宏定义标记这个值为260,而PP点点通恰巧是用VC6编写的,这里我们就不得不考虑是不是会出现什么问题了。利用我的测试软件,在测试中果真发现PP点点通初始化读取了这个文件,并且传递了“DownloadPath=”参数,一旦我们修改了这个默认的数值,PP点点通将会自动新建一个同名的文件夹作为下载文件夹,那么这就势必会引起对“DownloadPath=”参数长度的限制。很可惜,PP点点通根本没有注意到这个,一旦我们将这个参数的值改到超过260个字节时,你就会发现程序出错了,如图1所示。
         
下载 (41.12 KB)

3 小时前


        图1
现在看起来,漏洞果真是存在的了。你一定开始急得想调试漏洞,寻找跳转地址,然后放上ShellCode去执行了。且慢,如果你现在调试就会发现,此时程序的执行已经不是简单的返回地址被覆盖了,你没发现上面的报错内容跟以往的不一样吗?程序出现栈溢出的地方早已执行过去了,现在出现的错误只是前面栈溢出引发的另一个错误而已,传统的溢出利用这里完全不奏效。怎么办?别急,有两个办法可以帮助我们解决问题。第一个是找到溢出的地方,看能不能引出返回地址被覆盖的传统溢出现象,我测试了这个办法,答案是不能。那么就用第二个办法,就是所谓“将错就错”,既然这个是引发溢出后的另一个错误,那么就试图把它弄成一个能被我们利用的错误。还记得我们在传统溢出中为了执行ShellCode的办法吗?一个是利用系统DLL中的jmp xxx(寄存器)或者call xxx(寄存器)的方法,一个是覆盖SHE。我们现在既然要创建一个能被我们利用的错误,那么也就是寻找上述的两个办法来执行ShellCode,要么我们弄出一个错误,让程序出现jmp xxx或者call xxx出错,要么就去覆盖SHE。这里覆盖SHE不行,那么就只剩第一个办法了。经过我仔细的反汇编分析,用了将近一天的时间,终于成功的让PP点点通程序出现了让我们兴奋的call指令错误,如图2所示。
图2
看到了吗?图中黑色的那一行,“call dword ptr[eax+5c]”指令出错,而这里的eax是我们能够控制的指令,胜利的天平已经向我们倾斜了。可是稍等,这里的“call dword ptr[eax+5c]”指令是一个间接寻址指令,也就是说我们必须使得[eax+5c]的值成为一个指向我们ShellCode的指针数值,而此时只有ecx和edi寄存器指向我们可以利用的ShellCode,如图3所示。
下载 (72.14 KB)

3 小时前


图3
所以我们要么能让“[eax+5c]=edi”或者“[eax+5c]=ecx”,要么就是让[eax+5c]指向的地方是一个跳转语句或者call语句,类似“call edi”或者“jmp ecx”,让其变成间接的间接寻址,最终还是会跑到我们的ShellCode中去就行。说到这里我提出一个面对这种情况下,如何执行ShellCode的方法,因为这不是传统的“jmp esp”,esp直接就指向ShellCode,这里的情况是我们得间接执行ShellCode。按照上面的两个方法,我们为了寻找“[eax+5c]=edi”,可以在系统的动态库文件中,寻找一些指令,由这些指令组成一个等于edi值的连续地址。假设在user32中,某地址处的指令为“mov eax,ebx pop eax pop ebx ret”,那么它在内存中的显示就是“8B C3 58 5B C3”,而且我们需要的edi值就是“0x5B58C38B”,这个地址指向我们的ShellCode,那么我们只需要将eax的值赋值为上面user32[某地址-5c]即可,因为这样“call dword ptr[eax+5c]”获取的就是我们ShellCode的执行权。同样道理,我们也可以找一个“call edi”的指令地址,在系统DLL库中找指令组合,然后获得地址,修改我们的跳转指令。大家仔细看看图4和图5的示意图就会明白了。
下载 (18.49 KB)

3 小时前


图4
图5
其实这里最稳定的还是图5的使用方法,因为如果你使用图4的方法,所获得的ShellCode地址是相对稳定的,一旦电脑重新启动或者因为某些原因,例如堆的参与,很容易造成地址变化,而使用寄存器间接寻址则会保持稳定,因为寄存器的值始终指向我们的ShellCode地址。在接下来的时间里,我们就是寻找这样的符合我们要求的地址。你可以选择手工,也可以选择编个程序自动寻找,总之有了思路,一切皆有可能,最后,我们只需要放上一个符合格式的ShellCode即可。什么叫符合格式的ShellCode?还记得我们这里测试的参数吗?是一个路径值参数“DownloadPath”,既然是路径值,那么就不要在其中出现一些特殊符号啦,不然Windows会报警的,这也会影响我们的ShellCode执行。假设你要寻找符合这样要求的ShellCode,你可以参考我以前在黑防上发表的那篇关于腾讯安全控件漏洞的文章,那里的ShellCode是符合要求的。
现在为了证明我的理论的正确性,我暂时把ShellCode换成一个执行死循环的代码,从伪指令角度来说就是:“loop 1=1”,汇编代码是“EB FE”,这样一旦我们的这个ShellCode执行了,那么电脑就会忙得不可开交了。现在我们无非是要找到符合要求的那种所谓的间接再间接寻址指令的地址,我这里寻找的是一个找寻指向call(寄存器)或者jmp(寄存器)指令的地址,并且我为了保证这个地址能是一个比较稳定的地址,把寻找的目标放到了系统的动态库里面,当然你也可以寻找别的文件里的,只是一旦环境稍变化,恐怕你的地址就会成为错误的。手工寻找太累了,自己编写一个程序自动查找最好,其实这个很好编写,就是按照将地址加一,然后取出这个地址,利用这个地址找到所指处的十六进制代码是否是“FF D1”“FF D7”“FF E1”“FF E7”,这几个代码其实就是call ecx、call edi、jmp ecx和jmp edi这些指令的十六进制表示,只要我们找到其中的任意一个,我们都是可以利用来执行我们的ShellCode的,因为edi和ecx寄存器都指向了我们的ShellCode。经过大约一分钟的查找,真是太幸运了,我们找到了四个地址,可正如同我说的那样,为了稳定最好选择使用系统动态库的地址,这样我们把目标所在了“204D3DE1”,这个地址其实是在Windows XP SP2的一个专门的动态库文件“xpsp2res.dll”中的,不论怎样这都非常符合我们的要求。现在赶紧修改我们的过长字符串,将其中控制eax寄存器值的那个字符串值改为“204D3D85”,注意这里,这个值可不直接就是我们刚才找到的那个地址,还记得前面出错的那个call指令吗?因为出错时,利用的是[eax+5c],所以我们找到的地址一定要减去5c才行,这样PP点点通出错时会自动帮我们恢复成真正要利用的地址。修改好跳转地址后,再修改我们的ShellCode,把我们的死循环这个ShellCode放到离跳转地址大约100个字节以后,因为edi指向的地址比较靠超常字符串的后面,太前了出错时会执行不到那里。还需要说的就是,正因为edi指向的地址比较靠后,这样留给我们放ShellCode的位置就不是很充裕了,如果你要放一个比较长的ShellCode,建议你使用先放小ShellCode,此Code的主要目的是跳转后遍历查询大ShellCode,而大ShellCode就可以直接放到控制eax覆盖的跳转字符串的前面任意位置,那里可以放很长的字符串,估计完全够用。一切就绪后,我们用这个精心构造好的字符串赋值给“config.ini”文件中的“DownloadPath”参数,打开PP点点通,然后选择“退出系统”,你会发现你的电脑一下子忙到了100%!我为了更加清楚的反映程序出错时的状态,给大家截图如下,先看第一幅,如图6所示。程序出错了,还是出错在call指令上,而此时eax成功被我们控制进入xpsp2res.dll中。再看图7,看到了吗?我们成功控制程序流程进入了call edi指令,注意下方的显示,此时edi就指向了我们的简单ShellCode。一旦程序进入了我们的ShellCode,电脑就会进入一个死循环,图8中的任务管理器真实的反应了这一点。
         
下载 (57.71 KB)

3 小时前


        图6
图7
下载 (25.31 KB)

3 小时前


图8
到这里,表明我们的一切分析确实都是正确的,只是有时利用会出现一定的干扰,这个大家可以自己研究一下,这里我就不再分析了。现在大功告成,我们收工了。最后,我提供给大家一个POC,因为每个版本的Windows环境下利用的跳转地址不太一样,我就偷懒不挨个测试了,我直接给出触发到call指令的畸形文件,依据我上面的思路,自己修改练练手,也许你会有新的发现的。

转载于:https://blog.51cto.com/yyaidd/309190

PP点点通畸形文件溢出漏洞0Day相关推荐

  1. linux畸形文件夹,Linux下简单的缓冲区溢出

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 科班出身,或者搞过汇编C等的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或进程运行错误,导致缓冲区被&quo ...

  2. 织梦dedecms search.php注入漏洞exp,DedeCms V57 plus/search.php 文件SQL注射0day漏洞

    微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋. Hackme论坛原创 转载请附带原文链接 作者: c4rp3nt3r ...

  3. 在reader中勾选pdf复选框_Adobe Acrobat和Reader PDF文件处理缓冲区溢出漏洞

    Adobe公司的Acrobat和Reader软件是我们最常用的PDF文件编辑和阅读软件.它除了提供标准的PDF 阅读软件外还提供相应的插件,用来使浏览器可以直接浏览PDF格式的文档. Adobe的pd ...

  4. 全网最详细的渗透测试靶机实操步骤——vulnhub靶机实战(七)IMF【包含了sql注入,文件上传,gif图片木马制作,缓冲区溢出漏洞sploit等诸多知识点的靶机,超多干货】

    靶机地址:https://www.vulnhub.com/entry/imf-1,162/ 靶机难度:中级(CTF) 靶机发布日期:2016年10月30日 靶机描述:欢迎使用" IMF&qu ...

  5. VMware ESXi OpenSLP堆溢出漏洞,附本次勒索软件ESXiArgs恶意文件分析(CNVD-2021-12321对标CVE-2021-21974)

    近日以VMware ESXi服务器为目标的大规模勒索软件攻击正在席卷全球,包括法国.芬兰.加拿大.美国.意大利等多个国家数千台服务器遭到入侵.攻击者利用了2021年2月公开的高危漏洞(CNVD-202 ...

  6. 缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)

    实验内容: 分析缓冲区溢出漏洞,利用CCProxy 6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去. ...

  7. Linksys WRT54G 路由器溢出漏洞分析—— 运行环境修复

    博文视点安全技术大系 · 2015/08/04 15:40 本文节选自<揭秘家用路由器0day漏洞挖掘技术>,吴少华主编,王炜.赵旭编著,电子工业出版社 2015年8月出版. 本章实验测试 ...

  8. Netgear R6400v2 堆溢出漏洞分析与利用

    2020 年 6 月,ZDI发布了一个关于Netgear R6700型号设备上堆溢出漏洞的安全公告,随后又发布了一篇关于该漏洞的博客,其中对该漏洞进行了详细分析,并给出了完整的漏洞利用代码.该漏洞存在 ...

  9. 浅析缓冲区溢出漏洞的利用与Shellcode编写

    文章目录 前言 汇编语言 寄存器 内存堆栈 CPU指令 函数调用 缓冲区溢出 栈溢出原理 栈溢出攻击 ShellCode 总结 前言 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经 ...

  10. 89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解实战示例]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.文件包含漏洞详解 1.文件包含漏洞相关概念 2.PHP文件包含漏洞相关概念 3.PHP文件包含漏洞利用:`构 ...

最新文章

  1. php 生成非对称密钥,php实现非对称加密
  2. 开发日记-20190622 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  3. 启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用
  4. Python之IO编程
  5. PHP与MySQL开发中页面乱码的产生与解决
  6. python hook_python_理解篇_钩子方法的理解
  7. Linux命令行性能监控工具大全
  8. 删除单词后缀(信息学奥赛一本通-T1141)
  9. 兵乓球- 经典街机游戏-python小游戏源码下载
  10. Mysql中各种常见数据库存储引擎对比
  11. Python学习笔记1:数据模型和特殊方法(魔术方法)
  12. ubuntu 14.04中安装Jenkins
  13. 移动,电信,中行软开,微软,百度等企业工作纯技术性分析
  14. 数据分析师工资高达50万,正在进入每一个行业!
  15. H G W S哪一个不是状态函数_复变函数学习笔记(13)——单位圆盘上的自同构群(用了近世代数)...
  16. 文件夹访问被拒绝 你需要权限来执行此操作,您需要权限来执行此操作
  17. IC验证面试必考-跨时钟域
  18. 旅行青蛙南の旅旅行券_旅行时查找WiFi
  19. 早安!新春快乐!兔年大吉!
  20. mac下后端开发常用软件

热门文章

  1. java版简易计算器,java 简易计算器
  2. 蓝牙版本avrcp怎么选_干货|蓝牙网关是什么?蓝牙网关怎么用?蓝牙网关怎么选?...
  3. 惠普打印机墨盒更换教程_惠普打印机怎么换墨盒 一不小心就洒了一桌子墨水...
  4. wps表格l制作甘特图_WPS表格制作进度计划横道图教程
  5. minicom 使用方法
  6. AcWing 674.超级2048
  7. GB35114---聊聊SM2签名格式
  8. 三星S7edge刷极光ROM的总结
  9. idea安装axios
  10. 用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行