UAF学习之Adobe reader CVE-2013-3346
学习了UAF,分析了几个漏洞,同时,也熟悉了windbg的用法,收获挺大。
基本的UAF分析流程如下:
i:找有漏洞的函数
ii:找到被释放对象的类型,以及被释放对象在内存中的位置
iii:理解对象的释放方式
iv:重写被释放对象的地址空间
v:理解漏洞的根本成因
i:寻找有漏洞的函数
打开poc.pdf,出现了异常
(2f0.d64): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0c0c08a8 ebx=00000001 ecx=069d91c0 edx=292885fd esi=069d91c0 edi=00000000
eip=4a82f129 esp=002be1a0 ebp=002be1c4 iopl=0 nv up ei pl nz ac po cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00210213
4a82f129 ?? ???
查看堆栈,来分析函数调用流程,如下:
0:000> kb
ChildEBP RetAddr Args to Child
WARNING: Frame IP not in any known module. Following frames may be wrong.
002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2>
002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1>
002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab
002be1f0 6257d996 6257f409 0681ad20 58e57e21 AcroRd32_623e0000!DllCanUnloadNow+0x1510bc
002be23c 6257c68c 00000000 58e57e71 0681ad20 AcroRd32_623e0000!DllCanUnloadNow+0x14f66f
002be26c 6257c50e 067dc0f0 0690caf0 58e57ee1 AcroRd32_623e0000!DllCanUnloadNow+0x14e365
002be2fc 6257c206 0681ad20 069763f8 002be318 AcroRd32_623e0000!DllCanUnloadNow+0x14e1e7
可知,函数是从6257e85d之前调用的:
0:000> ub 6257e85d
AcroRd32_623e0000!DllCanUnloadNow+0x150518:
6257e83f 897dfc mov dword ptr [ebp-4],edi
6257e842 ff96d0020000 call dword ptr [esi+2D0h]
6257e848 0fb7d8 movzx ebx,ax
6257e84b 8b06 mov eax,dword ptr [esi]
6257e84d 59 pop ecx
6257e84e 8bce mov ecx,esi
6257e850 66899ecc020000 mov word ptr [esi+2CCh],bx
6257e857 ff9064030000 call dword ptr [eax+364h]
可知,6257e857为crashfun
ii:找到被释放对象的类型
分析上面汇编,易知esi的地址的值为虚表指针:则可以通过esi和windbg来分析被释放类型,如下
0:000> !heap -p -a esi
address 069d91c0 found in
_HEAP @ 2ea0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
069d91b8 0071 0000 [00] 069d91c0 00370 - (busy)
大小为370,同时,esi的地址也为对象地址069d91c0
,可以得到。
iii:查看被释放对象在内存中的地址
观察异常前的堆栈
WARNING: Frame IP not in any known module. Following frames may be wrong.
002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2>
002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1>
002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab
采用虚拟机回滚的方法来简便堆的调试
根据猜测,查看<1>的函数的调用处具体代码,并对该函数下断点。如下
eax=65f607a4 ebx= ecx=059f7d48 edx= esi=059f7d48 edi=
eip=6553e0cc esp=0022ddcc ebp=0022dde8 iopl= nv up ei pl nz na po nc
cs=001b ss= ds= es= fs=003b gs= efl=
AcroRd32_653a0000!DllCanUnloadNow+0x14fda5:
6553e0cc ff909c020000 call dword ptr [eax+29Ch] ds::65f60a40=6553e7f8
查看esp+8,即为对象地址。如下:
:> dd esp
0022ddcc 05a5bbc8
0022dddc 0022ddf0
:> !heap -p -a 05a5bbc8
address 05a5bbc8 found in
_HEAP @ 10a0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
05a5bbc0 [] 05a5bbc8 - (busy)
? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+2b4134 :> dd 05a5bbc8
05a5bbc8 65f607a4 65f6077c
05a5bbd8 65f6073c 65f60728
05a5bbe8 05bc8bc0 02641ff8
其中,05a5bbc8位置的值即为虚表指针。
iv:理解对象的释放方式。
直接通过buntdll!RtlFreeHeap ".if(poi(esp+0xc) == 05a5bbc8) {kb} .else{gc}"来查看堆栈的情况,并与crash时的堆栈进行对比,如下
0022d1c4 6553f5ae 00000001 00000000 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0xa5956
0022d218 6553f41b 0022d24c 6553e848 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0x151287
0022d220 6553e848 05dd6c50 2b83a232 00000001 AcroRd32_653a0000!DllCanUnloadNow+0x1510f4
0022d24c 6553e0d2 00000000 05a5c2d8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150521
0022d270 6553f3e3 0022d2c4 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab
0022d278 6553d996 6553f409 05dd6c50 2b83a2ba AcroRd32_653a0000!DllCanUnloadNow+0x1510bc
crash时:
0022dd9c 6553e85d 2b83adba 05a5bbc8 0x4a82f129
0022ddc4 6553e0d2 05a5bbc8 AcroRd32_653a0000!DllCanUnloadNow+0x150536
0022dde8 6553f3e3 0022de3c 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab
0022ddf0 6553d996 6553f409 2b83ae42 AcroRd32_653a0000!DllCanUnloadNow+0x1510bc
可以得出,函数在堆栈情况如下的函数中进行了释放
0022d24c 6553e0d2 05a5c2d8 AcroRd32_653a0000!DllCanUnloadNow+0x150521
如上所说,即在6553e0d2中释放,利用ida分析该函数。根据FreeHeap的kv情况,可以得到释放函数为对象的一个虚函数,如图所示
6553e82b je AcroRd32_653a0000!DllCanUnloadNow+0x150567 (6553e88e)
6553e82d 8d45f0 lea eax,[ebp-10h]
6553e830 push eax
6553e831 8d4e1c lea ecx,[esi+1Ch]
6553e834 e8e607f5ff call AcroRd32_653a0000!DllCanUnloadNow+0xa0cf8 (6548f01f)
6553e839 ffb6d4020000 push dword ptr [esi+2D4h]
6553e83f 897dfc mov dword ptr [ebp-],edi
6553e842 ff96d0020000 call dword ptr [esi+2D0h]
如图,esi为被攻击的函数对象的虚表指针。函数流程为[esi+2D0h] ,其中eax为另一个对象虚表指针。根据poc可得,该函数为addButtonFunc()函数,
v:重写被释放对象的地址空间
通过下断点分别查看在6553e0cc,6553e857,crash时对象的情况,可以得出,填充在调用6553e857之后,crash之前,如下:
//断在6553e00c时
:> dd 5c473d0
05c473d0 65f607a4 65f6077c
05c473e0 65f6073c 65f60728
05c473f0 05c66420 //断在6553e857时
:> dd 5c473d0
05c473d0 65f607a4 65f6077c
05c473e0 65f6073c 65f60728
05c473f0 05c66420 //crash时
05c473d0 0c0c08a8
05c473e0
05c473f0
vi:理解漏洞的根本原因
仔细分析调用流程,函数流程为[esi+2D0h]-->6553f409-->[eax+16]->,在6553f995处下断点,可得,其中eax为esi的虚表指针,而esi为一个对象的首地址,即在对象被释放前先生成了一个新对象。
赋值语句如下
.text:6019F595 lea eax, [esi+8Ch]
.text:6019F59B mov ecx, [eax]
查看esi对象的堆的情况,如下。
:> !heap -p -a esi
address 059fef10 found in
_HEAP @ 10a0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
059fef08 [] 059fef10 000fc - (busy)
? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+28779c
在05ae857设置断点,可看到释放对象在生成的对象为参数,且参数中含有对释放对象的引用,只要对该对象进行应用就可以产生UAF漏洞了。
vii:总结
创建一个父对象,poc所示为ToolButton,然后设置一个函数,函数创建一个子对象,子对象设置函数,对父对象进行删除,且保留了对父对象的引用,对子对象函数进行调用,即可产生UAF漏洞。
UAF学习之Adobe reader CVE-2013-3346的更多相关文章
- CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞
0x01 "Epic Turla" 网络间谍行动 在 2014 年 8 月,被誉为 "世界十大最危险的网络攻击行动" 之一的 "Epic Turla& ...
- Ubuntu 12.04安装Adobe Reader
原本从Adobe 官方网站下载了 Adobe Reader, 是个rpm包,先用agt-get 装了rpm(sudo apt-get install rpm), 一安装(rpm -ivh AdobeR ...
- Adobe Reader/Acrobat修改页面底色为豆沙绿
Adobe Acrobat_Pro_8修改PDF页面底色为豆沙绿保护视力(同样适用于Adobe Reader) http://jingyan.baidu.com/article/9989c746189 ...
- 给Adobe Reader添加书签功能
Adobe Acrobat Professional和Adobe Reader都是Adobe公司的产品.前者用来编辑制作PDF文档,后者只能用来阅读PDF.令人郁闷的是Adobe Reader中虽然有 ...
- 在Adobe Reader中保存PDF表单数据的方法
通常,Adobe Reader 用户填写表单后,是无法保存所填表单的副本的.但是,对于 Reader 8 和更高版本的用户,您可以扩展其权限,使他们可以完成此操作.如果您使用的是 Acrobat Pr ...
- adobe reader安装完成之前被中断,错误代码150210解决方法
adobe reader安装完成之前被中断,错误代码150210解决方法出现这种情况是因为之前安装过adobe reader但是没有卸载删除干净进而导致重新安装时无法安装.为什么卸载不了大多数是因为3 ...
- Ubuntu安装Adobe Reader
到 这里依次选择最新版本的Adobe Reader,我选择目前最新的 9.5.5版本的,下载下来后,双击选择dep包,启动软件中心进行安装,中间会提示软件包欠佳,选择" ...
- Ubuntu下安装PDF 文档阅读器Adobe Reader 9.5.5
由于没有PPA所以我们必须在Adobe的官方FTP上下载安装,下面的方法同时适用于32位和64位系统: wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9 ...
- JS检测浏览器Adobe Reader插件
Web应用中当我们希望向用户显示pdf文档时候,如果用户安装了Adobe Reader之类的pdf阅读器,就可以直接打开文档在浏览器中显示, 但是,当用户没有安装这类软件的时候,自然是打不开的,为了系 ...
随机推荐
- 云计算之路-阿里云上:SLB引起的https访问速度慢问题
自从我们在阿里云SLB上部署了https之后(详见在SLB上部署https遇到的问题及解决方法),陆续有园友向我们反馈登录时速度很慢(登录时是通过https访问),有些园友甚至无法访问登录页面. 而我 ...
- Swift 与众不同的地方
Swift 与众不同的地方 switch(元组) 特点 其他语言中的switch语句只能比较离散的整形数据(字符可以转换成整数) 但是swift中可以比较整数.浮点数.字符.字符串.和元组数据类型,而 ...
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- python 学习分享-select等
首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组(在linux中 ...
- 课时1:我和python的第一次亲密接触
目录: 一.Python3的下载与安装 二.从IDIE启动Python 三.尝试点新的东西 四.为什么会这样? 五.课时01课后习题及答案 ============================== ...
- 转: jsp之c标签
http://www.gbsou.com/2009/10/12/1028.htmljsp标签之c标签 核心标签库 它是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量.重复使用一组项目.测 ...
- PEAR DB 事务相关
1.autoCommit().commit().rollback() function autoCommit($onoff=false) 指定是否自动提交事务.有的后端数据库不支持. function ...
- 运维必须掌握的Linux面试题
1.解释下什么是GPL,GNU,自由软件? GPL:(通用公共许可证):一种授权,任何人有权取得.修改.重新发布自由软件的权力. GNU:(革奴计划):目标是创建一套完全自由.开放的的操作系统. 自由 ...
- BZOJ3990 排序(sort)
排序(sort) 题目描述 小A有一个1~2N的排列A[1..2N],他希望将数组A从小到大排序.小A可以执行的操作有N种,每种操作最多可以执行一次.对于所有的i(1<=i<=N),第i种 ...
- [LeetCode169]Majority Element
Majority Element Total Accepted: 58500 Total Submissions: 163658My Submissions Question Solution Gi ...