-
-
[原创]CVE-2010-2883学习笔记
-
发表于:
2018-8-13 21:24
9867
-
CVE-2010-2883是PDF阅读器Adobe Reader的一个栈溢出漏洞。以下是我的学习笔记。
该漏洞学习主要是参照泉哥的《漏洞战争》的相关内容。
漏洞存在于Adobe Reader 8.2.4到9.3.4之间的版本,在CoolType.dll库中处理字体文件SING( Smart INdependent Glyplets)表中uniqueName项时存在栈溢出漏洞。
strcat进行字符串拼接时没有进行长度判断,产生栈溢出。
使用PdfStreamDumper打开样本文件,在第10个Stream中找到SING字段,将这个Stream另存为TTF文件。
使用010edit打开另存的TTF文件,加载TTF文件模板,TTF的TableEntry结构如下:
在offset 11ch位置找到具体内容:
其中0x10偏移开始为uniqueName字段,大小为28字节且以\x00结尾。但是在CoolType.dll中,使用strcat操作此处时并没有判断长度,所以构造超长的uniqueName可导致栈溢出。
使用OllyDbg调试
在strcat处下断点
.text:0803DDAB call strcat
常见栈溢出漏洞,溢出后会覆盖当前函数的返回地址。我在该开始调试该漏洞时也是直接在当前函数ret处下断点,但是发现还没执行到ret时,已经跳入shellcode了。
不知道什么原因,只能单步调试,多次调试后发现,如下图所示
其中,[eax]的值来自ds:[edi:0x3c] ==> 0x12e754 ==> 0x12e6d0 ==>0x4a80cb38(位于icucnv36.dll)
分析可知,该漏洞利用没有使用覆盖返回地址的方法,而是覆盖了一个虚函数表指针,从而控制程序执行流程
通过两次跳转,将栈空间切换到0x0c0c0c0c
堆喷射代码
手动去掉混淆
继续ROP
此处ROP,依次调用CreateFileA、CreateFileMappingA、MapViewOfFile,在内存中开辟一块可读可写可执行的地址。
再调用memcpy,将shellcode拷贝到新的内存空间中去。
这是一个典型的栈溢出漏洞
漏洞利用没覆盖返回地址,而是覆盖了虚函数表。
《漏洞战争》书中调试时,使用了内存访问断点,可以更加直接地断在溢出后利用的地方
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!