作者丨黑蛋 一、漏洞描述 此漏洞编号CVE-2010-2883,看着是一个很简单的栈溢出漏洞,但是也要看怎么玩了。这个漏洞是Adobe Acrobat Reader软件中CoolType.dll在解析字体文件SING表中的uniqueName字段的调用了strcat函数,但是对参数没有做出判断,没有检查uniqueName字段长度,导致了栈溢出漏洞。此漏洞影响版本如下: Adobe Acrobat 8.0 Adobe Acrobat 8.1 Adobe Acrobat 8.1.1 Adobe Acrobat 8.1.2 Adobe Acrobat 8.1.3 Adobe Acrobat 8.1.4 Adobe Acrobat 8.1.5 Adobe Acrobat 8.1.6 Adobe Acrobat 8.1.7 Adobe Acrobat 8.2 Adobe Acrobat 8.2.1 Adobe Acrobat 8.2.2 Adobe Acrobat 8.2.4 Adobe Acrobat 9.0 Adobe Acrobat 9.1 Adobe Acrobat 9.1.1 Adobe Acrobat 9.1.2 Adobe Acrobat 9.1.3 Adobe Acrobat 9.2 Adobe Acrobat 9.3 Adobe Acrobat 9.3.1 Adobe Acrobat 9.3.2 Adobe Acrobat 9.3.3 Adobe Acrobat Apple Mac_Os_X Microsoft Windows Adobe Acrobat_Reader 8.0 Adobe Acrobat_Reader 8.1 Adobe Acrobat_Reader 8.1.1 Adobe Acrobat_Reader 8.1.2 Adobe Acrobat_Reader 8.1.4 Adobe Acrobat_Reader 8.1.5 Adobe Acrobat_Reader 8.1.6 Adobe Acrobat_Reader 8.1.7 Adobe Acrobat_Reader 8.2.1 Adobe Acrobat_Reader 8.2.2 Adobe Acrobat_Reader 8.2.3 Adobe Acrobat_Reader 8.2.4 Adobe Acrobat_Reader 9.0 Adobe Acrobat_Reader 9.1 Adobe Acrobat_Reader 9.1.1 Adobe Acrobat_Reader 9.1.2 Adobe Acrobat_Reader 9.1.3 Adobe Acrobat_Reader 9.2 Adobe Acrobat_Reader 9.3 Adobe Acrobat_Reader 9.3.1 Adobe Acrobat_Reader 9.3.2 Adobe Acrobat_Reader 9.3.3 这次我用的是9.0版本。
二、环境准备 虚拟机
调试工具
目标软件
16进制编辑器
Win7X86SP1、Kali
Ida、x32dbg
Adobe Acrobat_Reader 9.0
010Editor
三、漏洞复现 使用MSF生成EXP:
然后在Win7中安装Adobe Acrobat_Reader 9.0:
把Kali中的Exp拖到本机,再拷贝到Win7中,拖到Adobe中:
弹出计算器,证明漏洞存在,Exp也没有问题。
四、漏洞分析 首先我们需要做几个准备工作,1、改掉随机基址,省的麻烦,把用010Editor打开Adobe,修改如下地方:
2、在把软件拖调试器中,忽略程序自身异常(因为我这边调试器接管异常,导致程序运行不下去,所以需要忽略)
接下来就是正儿八经分析了,因为已知漏洞问题是在CoolType.dll,直接在安装文件夹下找到这个dll,拖到Ida中:
然后Alt+T,搜索sing:
双击到标记的一条:
下面这一坨就是漏洞溢出的地方,如果有需要可以自行分析一下,或者使用其他手段找到溢出点:
我们直接看strcat函数,地址是0x0803DCA4,这里基址是0x08000000,所以函数偏移是3DCA4,接下来我们就是动态追踪一下计算器弹出的具体过程,用x32dbg附加软件,F9运行,等软件加载完所需要的dll,然后 查看各个模块基址,找到CoolType.dll,基址是0x60690000,那么加上偏移就是0x3DCA4=0x606C DCA4:
跳转到0x606CDCA4,下断点:
接下来把我们生成的Exp拖到软件中,稍微等会,就断在了我们断点处,然后在堆栈窗口中转到EBP,观察溢出情况:
我们先看看strcat函数的俩个参数,堆栈中转到ESP,可以看到,源数据和要拷贝的地址,而要拷贝的地址就是EBP:
然后走过strcat函数,观察EBP的位置,发现已经被淹没覆盖:
然后继续往下走,走到如下函数单步步入:
然后步入下面这个call:
然后步入第一个call:
然后走到如下位置:
这里的call是exp特意构造的,如果追寻eax的来源,就会发现他指向我们拷贝的数据中的一个地址,这里是把栈抬高到我们淹没EBP那里,进入这个函数就会发现,函数流程已经被我们劫持了,从这里开始就进入我们的流程:
接下来会进入一系列ROP链(这里使用了堆喷技术,目的为了绕过DEP):
走到这里,调用了一个CreateFile创建了一个iso88591文件,其参数都是Exp构造好的: 21.png !
文件在这:
在这里可以看到EAX指向一个CreateFileMapping函数,创建文件映射:
随后跳转到此函数:
之后根据同样手法,进入MapViewOfFile函数,将一个文件映射对象映射到当前应用程序的地址空间:
跑了半天,又用之前的手法走到memcpy函数,如果留意的话,就会发现,这里是把shellcode写到MapViewOfFile返回的地址,因为这里是可写可读可执行,绕了半个地球,就是为了绕过DEP:
然后这里就是正儿八经shellcode地方:
经过一段解密,可以看到字符串calc.exe:
从这里可以看到是通过CreateProcessA创建了计算器:
以上就是Exp的运行过程,最后弹出计算器的结果。
五、总结 这个Exp的编写用了很多技术,包括利用了PDF文件可执行js代码的特性,然后使用栈溢出劫持运行流程到icucnv36.dll,这个模块没有ASLR保护,然后再通过ROP链,各种寄存器布置,然后新建文件,又将文件映射到内存,再把shellcode拷贝到这块区域。 参考链接:http://static.anquanke.com/download/b/security-geek-2019-q2/article-12.html
标签:8.1,CVE20102883,Adobe,漏洞,8.2,Reader,Acrobat From: https://blog.51cto.com/u_15452079/6162252