[漏洞战争]漏洞复现:CVE-2010-2883Adobe Reader TTF字体SING表栈溢出漏洞

本文详细分析了Adobe Reader中的CVE-2010-2883漏洞,该漏洞因处理TTF字体SING表的uniqueName项时栈溢出导致。文章介绍了漏洞环境、Windows基础知识如GS保护、DEP和ASLR,以及漏洞复现、动态调试和修复方法。通过动态调试,展示了如何利用栈溢出构造ROP链,绕过ASLR并执行恶意代码。最后,讨论了漏洞修复措施。
摘要由CSDN通过智能技术生成

漏洞描述

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值