首页
社区
课程
招聘
[原创]cve-2010-2883分析
发表于: 2018-10-6 14:54 4546

[原创]cve-2010-2883分析

2018-10-6 14:54
4546

研究的第一个cve,研究完觉得发现这个cve的人脑洞为什么能这么大。。

环境配置 :

漏洞点在SING表处,位于CoolType.dll文件处。

先将恶意pdf文件导入PDFStreamDumper,查看之后可以找到SING表的数据结构。

官方定义的SING的数据结构:

根据我们所找到的SING表的数据,可以知道偏移地址为0x11c。再往下找0x11c偏移处的内容:

但是在偏移0x10处的内容才是uniqueName域起始内容。

先来看看处理SING表的那一块函数地方。

先把字符串SING入栈,后入栈edi,调试可得:

暂且还不知道他的内容是怎么回事。继续看。

后来赋值了ecx。调用完函数之后eax中函数的返回值就是原ecx的值,来对比一下前后的值。

前八个字节发生了变化。在看后四字节0x1DDF。这不就是前面所看到的数据长度吗?所以我们可以推测出该函数大致上就是处理SING表内容的。再看看前四字节,调用完函数之后又重新赋值了一遍eax,刚好是把前四字节赋值给了eax。再看看后面对于eax的调用,又有一处加上了0x10,所以我们看看其地址处的内容:

这不就是前面所看到的SING表内容吗,后面调用eax加上0x10的原因就在于加上0x10后的地址处内容才是uniqueName域的内容。

然后看edi的作用,edi寄存器所指的地址内容设置一下内存访问断点,查看一下被什么调用即可,经多次查看之后就可以发现edi偏移0x30处的0x4A8F374被下面图中处代码调用过。

在查看一下该处地址的对应内容:

这是PDF文件中的字体对象。

所以说我们这里已经搞清楚了第一个call函数的用途:

函数通过传入表目录项的 TAG 名称,然后读取表目录项,处理后返回两个元素,第一个元素为表目录的内存映射地址,第二个元素为表目录的长度。

搞清了第一个函数之后再看看下一个漏洞点的函数:

用Ollydbg调试看看。

先是加上了0x10,即前文提到的uniqueName域,压入栈中,而后将ebp入栈,再调用strcat函数,所以说就是将uniqueName域拼接到ebp指向的地址。

因为并没有限制拼接的长度,所以就产生了溢出。

接下来跟踪查看一下作者所构造的ROP链,是如何来利用这个溢出漏洞的。跟踪反复调试过之后可以得出,先执行到此处。

进入sub_8016BDE函数中:

而后进入到sub_801BB21函数当中:

再进入[eax]函数处,即0x808b116:

再进入[eax]处的存放地址,实际上是栈中存放的地址:

eax:0x0012E6D0,call地址:0x4A80CB38 返回到 icucnv36.4A80CB38 来自 icucnv36.4A846C49

而strcat拼接的地址是从0x0012E4D8开始的。

继续看接下来的调用:

调用前:ebp --> 0x0012DD48

调用后:ebp --> 0x0012E4DC

esp --> 0x0012E4E0

ebp --> 0xE78B53AB

eip --> 0x4A82A714 icucnv36.4A82A714

接下去的ROP:

esp --> 0x0c0c0c0c

接下去就是在堆内存0x0c0c0c0c处构造好的shellcode了。

这种在0x0c0c0c0c处构造shellcode的方法是堆喷射。

我画了一个图,可以自行边调试边参考我画的在栈中执行的流程图。

可以看出来该跳转的稳定性主要来源于0x4A80CB38和0x4A82A714这两处地址,两处地址都位于icucnv26.dll的地址空间,而在Adobe的各个版本上,这个dll上的两处地址一直不变,所以该exploit在各个版本都很稳定。

返回到0x0C0C0C0C后栈中的情况:

先跳到0x4A8063A5处,

而后转入0x4A802196,

再转入0x4A801F90,

转入0x4A80B692,

调用CreateFile函数,再查看栈中的内容:

创建了一个名为“iso88591”的文件。

执行完该函数之后又用前面ROP调用CreateFileA相同的手法调用了CreateFileMapping函数,该函数创建了文件内存映射。此时调用的各个参数为:

后又执行,

调用MapViewOfFile函数,各个参数:

后调用memcpy函数,各个参数:

这里因为有着DEP的机制,所以说shellcode在堆栈上是无法执行的,因此这里就可以创建一个文件对象,然后映射到可读可写可执行的内存区域,再将shellcode拷贝到该区域,就可以执行shellcode了。而且恰好我们构造的ROP都处于icucnv36.dll,此处不受aslr保护,成功绕过aslr。

成功执行。

 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//