漏洞描述
CVE-2010-2883是Adobe Reader和Acrobat中的CoolType.dll库在解析字体文件SING表中的uniqueName项时存在的栈溢出漏洞,用户受骗打开了特制的PDF就有可能导致执行任意恶意代码
漏洞描述
推荐使用的环境
操作系统 Windows XP SP3
虚拟机 VMware
调试器 OD IDA
漏洞软件 Adobe Reader9.3.4
Windows基础知识
1.GS保护
类似于linux上的canary,函数执行前存放在返回值与ebp上(低地址),然后当我们程序执行完毕之后会调用检查函数来判断该值是否与之前相同,因此我们此时就不能通过覆盖ret地址进行ROP链构造了,而是修改栈上保存的某一个函数指针来进行利用
IDA反汇编可以看到函数开始前会有如下指令:
.text:0803DCF9 ; __unwind {
// loc_8184A54
.text:0803DCF9 55 push ebp
.text:0803DCFA 81 EC 04 01 00 00 sub esp, 104h ; esp开拓栈空间0x104
.text:0803DD00 8D 6C 24 FC lea ebp, [esp-4]
.text:0803DD04 A1 B8 0F 23 08 mov eax, ___security_cookie
.text:0803DD09 33 C5 xor eax, ebp
结束函数的时候有以下判断
.text:0803DEE1 E8 A9 A2 00 00 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text:0803DEE1
.text:0803DEE6 81 C5 08 01 00 00 add ebp, 108h
.text:0803DEEC C9 leave
.text:0803DEED C3 retn
2.DEP(Data Excution Prevention)数据执行保护
类似于Linux上的NX,所以这里我们可以使用ROP来进行栈迁移进行绕过,我们可以再OD上输入指令alt+m来查看内存情况,类似pwndbg中的vmmap,十分方便(这里插一句我个人还是更喜欢gdb,不知道为啥就对Linux的喜爱更甚Windows)
3.ALSR
在加载程序的时候不再使用固定的基址加载,支持ASLR的程序在其PE头中会设置IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识来说明其支持ASLR。例如,如果 icucnv36.dll 开启了 ASLR,那么同一个代码的地址,可能是 0x4A80CB38,也可能是 0x5A80CB38。由于无法知道准确的地址。
复现过程
去 Adobe Reader下载软件安装,打开复制连接,用迅雷很快就下载好了
基于字符串定位的漏洞分析方法
根据漏洞描述,反汇编CoolType.dll,找到有关SING字体
根据描述,找到有关查找交叉引用
漏洞点,可以看到是在调用strcat的时候,未对uniqueNmae字段进行长度校验而造成的溢出
动态调试分析
TTF提取和SING入口点分析
使用Onlydbg 在SING的调用处下断点(0x0803DD74),可以看到目前运行的模块是CoolTypel.dll
拖入样本文件,按下F9运行,程序会停断点处,继续运行到这里图示处,根据书中的描述这里是Sing表的处理函数,根据ECX的值,我们可以定位到SING表
我们使用PDFStreamDumper提取出PDF文件的TTF文件,然后搜索SING字符串找到TableEntry数据结构
官方文档中对于TableEntry结构的定义
关于TTF
TTF文件的结构十分简单,它是由一系列的表组成的,开头是一个Font Directory,记录了整个文件以及各个表的信息。每个表都有一个四字节的标签,SING就是一个标签。要注意的是,每个Table Directory的顺序和后面的各个表的顺序并不是一一对应的,要根据Table Directory中的offset值找到对应表的位置。每个表都包含了关于字体的不同信息,SING(Smart INdependent Glyphlets)表中包含的是和生僻字有关的信息。
typedef struct_SING
{
char tag