0%

CVE-2010-2883 Adobe Reader TTF字体SING表栈溢出漏洞

由于原版书中以最短的篇幅讲了这个漏洞,有很多地方过的很快可能不是很清楚,因此我自己在循序渐进过一遍

漏洞描述:Adobe reader中的CoolType.dll库解析SING表中uniqueName时存在栈溢出漏洞。

思考漏洞分析思路:

1、已经拿到poc.pdf样本文件,已知漏洞发生的位置是Cooltype.dll解析sing表unqiename字段时存在栈溢出漏洞,因此可以直接用IDA打开Cooltype.dll找到解析sing表的方式。(如果没有这个已知条件,不知道漏洞发生在Cooltype.dll中,应该怎么分析?希望有大神能跟我一起讨论)

2、找到了9个包含SING字符串的函数,未确定漏洞函数是哪一个。在所有函数上下断点,运行程序,在运行到0803deaf继续运行后程序会退出CoolType领空,且此时esp和ebp为0c0c0a90和0c0c0b8c明显是被篡改了。因此初步判断0803deaf为漏洞函数(书上没有这一步)
1-1

3、IDA反汇编0803deaf所在函数0803daef,可以看到非常容易出现问题的strcat函数。在0803dba1下断点,观察strcat前后的堆栈状况
1-2
1-3
目的地址0012e504距离栈顶0012e494仅仅10H,strcat执行后栈空间被破坏
1-4

4、接下来通过ttf格式,sing表格式找数据源,ttf格式
参考https://docs.microsoft.com/en-us/typography/opentype/spec/font-file
参考书中sing表的数据结构(sing表好像现在已经不再使用,没有在微软找到相应的表结构)
对比我们的object101-9

5、1-5从strcat参数可以知道源是eax+10,在动态调试时指向sing表偏移10的位置,即uniquename字段。

6、可以得出结论,该漏洞形成原因是一个常见的缓冲区溢出漏洞,adobe reader调用strcat从sing表的uniquename字段复制数据到栈中时,未对uniqueName字段字符串长度进行检测。

7、接下来分析漏洞的利用方式,在恶意构造的栈上下内存访问断点(0012e504-0012e744),跳过bib和msvcr80领空,来到0808b062(call [eax])处,而此时eax为恶意构造的4a80cb38(rop指令)。这里控制EIP的方式特别难分析,待以后分析。

8、4a80cb38(rop指令)->4a82a714(rop)->0c0c0c0c,0c0c0c0c中存放的依旧是rop指令用来绕过aslr和dep并且生成恶意文件执行恶意代码。

其实这个漏洞的利用方式还是蛮难的、是书上第一个案例,给我这种萌新好强的挫败感啊。。。。