CVE-2010-2883
是一个典型的由 strncat
使用不当,造成的栈溢出。通过在未开启ASLR
的lib
的 gadget
来实现 ROP
,达到最终的恶意代码执行。
样本分析
CVE-2010-2883
是 Adobe Reader 和 Acrobat
中的 CoolType.dll
库在解析字体文件 SING
表中的 uniqueName项时存在的栈溢出漏洞,用户受骗打开了特制的 PDF 文件就有可能导致执行任意代码。 使用 PdfStreamDumper
提取出 PDF 样本里的 TTF 文件。 TTF中关于 SING 表的 TableEntry 结构数 据,如下如所示:
官方文档中对 TableEntry
结构的定义:
1 | typedef struct_SING |
SING
表的数据结构如下图:
从TableEntry
结构入口偏移 0x11c
(上方offset
值)即是 SING表的真实地址,也就是从 “00 00 01 00”
开始 的部分,接着再偏移 0x10
即可找到 uniqueName
域,如下图所示:
执行 strcat()
后, 会将 “58 E0 8D AD
” 起始的部分赋值到 ebp 的指定地址 (0x0012e4d8
),直至遇到 NULL字符串终止符。 PDF中所带的 JS 代码如下所示,该代码我们可以看到 利用了 堆喷射,申请了大量 堆块空间 将 shellcode 写到每个堆块上,以提高 shellcode的命中率。同时在 shellcode 中 增加了 大量 “0c0c0c0c” 滑板命令,以此实现能够跳转到 shellcode执行
1 | var unescape = unescape; |
漏洞调试
调试环境
环境 | 备注 | |
---|---|---|
操作系统 | Windows 10 | |
调试器 | OllyDbg | 1.10 |
反汇编 | IDA Pro | 7.2 |
漏洞版本 | Adobe Reader | 9.3.0 |
漏洞分析
用IDA反汇编 CoolType.dll
库,查看字符串可以发现 “SING” 字体,因为该字符串是漏洞解析出错的地 方,直接定位进去即可查看该库对 sing 表格的解析方式,主要是 strcat 造成的溢出漏洞:
1 | .text:0803DBF2 push ebp |
CoolType.dll 本来只是想拷贝 uniqueName
域的字符串,但是由于 strcat()
是由 “/x00” 来控制拷贝结 束,所以该函数会将 SING
表中 从 uniqueName域开始 直到 遇到 “/x00” 结束的 所有字符串拷贝进固 定地址。造成栈溢出。 我们对拷贝的数据设置 内存访问断点,查看引用数据的 函数。
接着将 拷贝的数据 依次 移动到另一个缓冲区内。
随后跳转运行到 CoolType.7B6B6B96
再跳转到 CoolType.7B6BBAD9
再跳转到 CoolType.7B72AFCE
最后我们在该函数中,可以看到漏洞触发点,指令 Call dword ptr ds:[eax]
,其中 eax 为 我们输 入的数据 4A80CB38
我们跟进,发现 4A80CB38
处地址 为 程序中的 gadget指令,猜测此处开始 执行 ROP
步骤。 随后该指 令返回到 4A82A714
4A82A714
处也是 gadget 指令,此时 Call dword ptr[eax+0x5c]
处地址为 0c0c0c0c ,根据我们 输入的PDF中的JS代码,发现该地址是我们进行堆喷射使用的地址 0c0c0c0c
,此处由于Windows10的 栈环境不同,导致该处地址出错,该地址为无效地址。 程序调用无效地址,崩溃退出。
漏洞触发过程
1 | 1. 0x7B6DDCA4 call <jmp.&MSVCR80.strcat>; CoolType.dll模块,拷贝SING表数据, |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/08/21/CVE-2010-2883调试分析/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!