CVE-2010-2883学习笔记

CVE-2010-2883是PDF阅读器Adobe Reader的一个栈溢出漏洞。以下是我的学习笔记。

该漏洞学习主要是参照泉哥的《漏洞战争》的相关内容。

1.分析环境

操作系统:XP SP3

调试器:OllyDbg

反汇编:IDA Pro 7.0

Adobe Reader : 9.3.4

2.基本信息

2.1 使用Metasploit生成样本

CVE-2010-2883学习笔记_第1张图片

2.2 漏洞基本信息

漏洞存在于Adobe Reader 8.2.4到9.3.4之间的版本,在CoolType.dll库中处理字体文件SING( Smart INdependent Glyplets)表中uniqueName项时存在栈溢出漏洞。

2.2.1 用IDA 打开CoolType.dll,定位到出现漏洞的位置

CVE-2010-2883学习笔记_第2张图片

strcat进行字符串拼接时没有进行长度判断,产生栈溢出。

2.2.2 PDF文件分析

使用PdfStreamDumper打开样本文件,在第10个Stream中找到SING字段,将这个Stream另存为TTF文件。

CVE-2010-2883学习笔记_第3张图片

使用010edit打开另存的TTF文件,加载TTF文件模板,TTF的TableEntry结构如下:

CVE-2010-2883学习笔记_第4张图片

在offset 11ch位置找到具体内容:

CVE-2010-2883学习笔记_第5张图片

其中0x10偏移开始为uniqueName字段,大小为28字节且以\x00结尾。但是在CoolType.dll中,使用strcat操作此处时并没有判断长度,所以构造超长的uniqueName可导致栈溢出。

3.漏洞利用

使用OllyDbg调试

CVE-2010-2883学习笔记_第6张图片

在strcat处下断点

.text:0803DDAB call strcat

常见栈溢出漏洞,溢出后会覆盖当前函数的返回地址。我在该开始调试该漏洞时也是直接在当前函数ret处下断点,但是发现还没执行到ret时,已经跳入shellcode了。

不知道什么原因,只能单步调试,多次调试后发现,如下图所示

CVE-2010-2883学习笔记_第7张图片

其中,[eax]的值来自ds:[edi:0x3c] ==> 0x12e754 ==> 0x12e6d0 ==>0x4a80cb38(位于icucnv36.dll)

分析可知,该漏洞利用没有使用覆盖返回地址的方法,而是覆盖了一个虚函数表指针,从而控制程序执行流程

ROP分析,从上一步开始,开始利用ROP技术绕过DEP防护

通过两次跳转,将栈空间切换到0x0c0c0c0c

HeapSpray,0x0c0c0c0c地址由PDF中的js脚本进行堆喷射,提前布置好了rop和shellcode(使用PdfStreamDumper提取)

堆喷射代码

CVE-2010-2883学习笔记_第8张图片

手动去掉混淆

CVE-2010-2883学习笔记_第9张图片

继续ROP

CVE-2010-2883学习笔记_第10张图片

此处ROP,依次调用CreateFileA、CreateFileMappingA、MapViewOfFile,在内存中开辟一块可读可写可执行的地址。

CVE-2010-2883学习笔记_第11张图片

再调用memcpy,将shellcode拷贝到新的内存空间中去。

跳转进入shellcode,执行payload。

4.小结

这是一个典型的栈溢出漏洞

漏洞利用没覆盖返回地址,而是覆盖了虚函数表。

《漏洞战争》书中调试时,使用了内存访问断点,可以更加直接地断在溢出后利用的地方

5.参考资料

《漏洞战争》,riusksk

CVE-2010-2883浅析-Adobe Reader栈溢出漏洞


本文作者:QuietBar(看雪论坛ID)

原文链接:https://bbs.pediy.com/thread-246274.htm

转载请注明转自看雪论坛。

你可能感兴趣的:(CVE-2010-2883学习笔记)