CVE-2010-2883字体文件SING表栈溢出

0x00 漏洞概述

Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器。基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x版本,8.2.5之前的8.x版本的CoolType.dll中使用了不安全的字符串拼接函数strcat, 导致栈的缓冲区溢出。远程攻击者可借助带有TTF字体Smart INdependent Glyphlets (SING)表格中超长字段的PDF文件执行任意代码或者导致拒绝服务(应用程序崩溃)。


0x01 技术分析

a. 分析环境及工具

winxp sp3简体中文版

adobe reader 9.3.4

PdfStreamDumper.exe

Metasploit

Ollydbg1.10


b. 生成exploit

进入MetasploitConsole,依次输入如下命令,最终生成带有漏洞的pdf文件。



c. 查找溢出点

TrueType是由美国苹果公司和微软公司共同开发的一种电脑轮廓字体(曲线描边字)类型标准。这种类型字体文件的扩展名是.ttf,类型代码是tfil。

TableEntry结构体

typedef sturct_SING

{

chartag[4];          //"SING"字符

ULONGcheckSum;    //校验和

ULONGoffset;        //相对文件偏移

ULONGlength;       //数据长度

} TableEntry;

SING表结构体

其中uniqueName在距离结构体头部0x10位置.



IDA里面View -> Opensubviews -> strings

Ctrl+F搜索”SING”字符串


Ctrl+X查找字符串的引用,总共有9条引用,双击进去后逐个查找。



在第二条引用里面,距离”SING”字符串不远的地方查看到调用strcat函数,不安全的调用。

char *strcat( 

   char*strDestination, 

   const char*strSource ); 

Parameters

strDestination

Null-terminated destination string.

strSource

Null-terminated source string.

Return Value

Each of these functions returns the destination string(strDestination). No return value is reserved to indicate an error.


使用IDA的F5功能,v18为SING表起始位置指针,0x10为uniqueName到表头起始位置的偏移,开始从TTF拷贝数据到内存。
等效于: strcat(buf, SINGTable->uniqueName);


d. 查找shellcode
使用PdfStreamDumper打开漏洞pdf文件,找到ttf字体文件部分。


搜索字符串”SING”,  0xEC处为_SING结构体起始位置, 向后的8个字节为SING表数据的offset, 通过它找到SING表真实数据,再跳过0x10字节位置即为strcat需要拼接的数据。


e. 开始调试

启动adobe reader进程,od附加后,在溢出点下断点。再用adobe reader打开exploit pdf。




选中所有的shelloce,在上面下内存访问断点,F9运行,开始寻找执行shellcode的代码。


第一次断下,读取shellcode,不是执行,继续F9跳过。


拷贝整段shellcode。《漏洞战争》说将内存区段修改为可读写,这里没有修改也没有问题。
会断很多次,继续F9跳过。


在内存断点断下几次后,进入读取shellcode上关键地址0x4A80CB38, 开始进入rop。
因为xp默认关闭基址随机化,所以0x4A80CB38地址是固定的。


add ebp,0x794
Leave
Retn
精心寻找的rop指针1



pop esp
retn
精心寻找的rop指针2


关键rop地址0x4A82A714, 切换栈帧到堆空间(0x0c0c0c0c)
堆喷射已经将rop链准备好。



pop ecx

retn

精心寻找的rop指针3




mov dword ptr ds:[ecx], eax
retn
精心寻找的rop指针4




pop eax

retn

保存CreateFileA函数地址到eax



jmp dword ptr ds:[eax]

跳转到CreateFileA



打开iso88591文件,根据后面分析可知,不是为了读写文件,是为了创建内存映射文件。



剩下的rop chain,代码的主要意思是通过内存映射文件创建共享内存,然后memcpy把要真正运行的shellcode拷贝带可执行属性的内存段。



memcpy调用,开始拷贝真正运行的shellcode.



shellcode解密后的真正目的,开始调用WinExec.


弹出计算器



0x02 总结
       栈溢出(Stack Overflow)是在网络与分布式系统中被广泛利用的一种漏洞类型。在汇编中,以线程为线索的指令执行对函数的调用及局部变量的存取是依靠栈来实现的,黑客可以使用特定的脚本语言,利用对栈中数据的填充越界,实现有效的漏洞攻击。
       普通用户需要安装杀毒软件,及时更新软件和系统补丁。不随便打开未知邮件的pdf。
       软件开发者要避免使用strcat,strcpy等不安全字符操作函数,推荐使用微软的strcat_s, strcpy_s安全的字符操作函数。
 
0x03 参考文献
《漏洞战争:软件漏洞分析精要》林桠泉





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值