CVE-2015-5122 简要分析(2016.4)
CVE-2015-5122 简要分析
背景
最近在学习Flash漏洞的分析,其与IE漏洞的分析还是有诸多的不同(不便)之处,折腾了一阵子终于克服了没有符号表、Flash的超时定时器等问题。所以找到了去年HT事件其中的一个Flash漏洞,练练手,分析和学习。
分析
测试环境:Win7 64bit+IE10+Flash 17.0.0.169
在exp开始的时候会先判断系统是64位还是32位,然后调用利用的关键函数TryExp1。
1. InitArray
在函数TryExp1中,其会先创建一个大小为0x7e的Array,此时的Array在内存中的布局:

2. Set Array[0~0x1d]
创建Array后,接下来会将长度为0x62的unit vector赋值给Array[0]~Array[1d],as代码段:

创建的unit vector在内存中的分布:

此时的Array:

&ArrayBuff[0~1d]:

内存中Array[0]的值:


3. Set Array[2e~7d]
接着为Array[2e~7d]赋值,这次是长度为8的unit vector,对应的as代码:

赋值完毕后,Array的内存布局.
&ArrayBuff[2e~7d]:

Array[2e]:

4. Set Array[1e~2d]
接下来TextLine对象赋给Array[1e~2d],代码:

赋值结束后,Array的内存布局。
&ArrayBuff[1e~2d]:

5.Set Array Value Over
对Array的赋值都结束后,此时Array中的内容:

6. Allocate Background object
通过为上面的TextLine设置opaqueBackground属性,接下来会分配大小0x390的Backgroud对象。分配该内存的代码段在IDA中的截图:

通过对该代码段设置断点,可以得到所有创建对象的地址:

7. override valueOf method and call it
接着,程序会重载MyClass类的valueof方法为valueof2,重新设置TextLine的opaqueBackground属性,相关代码段:

8. my valueof method
因为_mc是一个类,所以在设置opaqueBackground属性的时候,valueof2函数会被调用。
这一过程中,valueof2函数一共会被调用6次,形成一个嵌套调用,最后一次调用的时候,进入else分支中,完成Background object的释放和unit vector的占位。当valueof2函数返回的时候,还会对Backgroud操作,所以其返回值就有可能会写入到某个unit vector的头部。下面来具体分析一下这个过程:
9. free Background object

这段执行完毕后,会释放之前创建的5个Background object,利用windbg搜索和之前的object地址对比,就能够得到释放object的地址:

10. occupy the freed memory
接下来使用大小为0x190的unit vector,尝试对刚释放掉的Background object内存进行占位。
至于为什么要使用0x190大小的内存进行占位,是因为接下来会对object+320h位置进行赋值操作,这个偏移刚好是两个unit vector的内存大小,这样就有机会对unit vector的长度进行改写。
可以看到一个已经释放掉了的Background object被unit vector占据:

11. set Background value
当valueof2函数返回的时候,会使用其返回值对object+320h进行赋值,IDA中的代码段如下:

此时地址处的Background object已经被unit vector占据,改写unit vector的长度为6a:


12. get big unit vector
在得到一个较大的unit vector之后,程序会利用这个vector改写紧接其后的一个vector长度为0x4000000:

在获得这一一个超大长度的vector之后,攻击者就拥有了当前程序地址空间类,任意地址读写的能力了。
补丁对比
有点好奇Adobe是怎么来补这个漏洞的,所以分析了一下补丁。
补丁前:

补丁后:

可见,Adobe将valueof函数的调用放在了获得Background object地址之前。这样如果在valueof函数中,Background object被释放掉了,在走到语句“mov [esi+320h], bl”之前,就会再重新为其分配一块内存。
这也再一次说明了,UAF漏洞从本质上来说就是时序问题。
by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016
CVE-2015-5122 简要分析(2016.4)的更多相关文章
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- Google发布SSLv3漏洞简要分析报告
今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...
- Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ...
- [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp85 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给 ...
- ITS简要分析流程(using Qiime)
Qiime安装 参考资料:http://blog.sina.com.cn/s/blog_83f77c940101h2rp.html Qiime script官方说明http://qiime.org/s ...
- Android初级教程通过简要分析“土司”源码,来自实现定义土司理论探讨
由于系统自带的土司瞬间即逝,而且非常难看.因此我们就希望自定义自己的土司风格.有些实例就是基于自定义土司完成的,例如金山卫士的火箭发射,基本原理就是个土司.但是在做出自己的土司风格之前,还是要简要分析 ...
- Android Hal层简要分析
Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...
- [Java] LinkedHashMap 源码简要分析
特点 * 各个元素不仅仅按照HashMap的结构存储,而且每个元素包含了before/after指针,通过一个头元素header,形成一个双向循环链表.使用循环链表,保存了元素插入的顺序. * 可设置 ...
随机推荐
- MBR,boot loader, partition table, backup, recovery, clean 硬盘引导记录,分区表备份,恢复,清空
linux/unix系统的分区表结构位于硬盘开始的MBR上.MBR上大小为512bytes. MBR=446B启动信息+64B分区表+2B分隔符=512字节 前面的446bytes作为启动信息,启动信 ...
- Python学习入门基础教程(learning Python)--6.4 Python的list与函数
list是python下的一种数据类型,他和其他类型如整形.浮点型.字符串等数据类型一样也可作为函数的型参和实参来使用! 1.list作为参数 list数据类型可以作为函数的参数传递给函数取做相应的处 ...
- classnull100 - The 3n + 1 problem
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 The 3n + 1 problem Background Problems in Computer Science are o ...
- 语音语音合成科大讯飞和Tizen-TTS语音合成引擎
废话就不多说了,开始... 最近在做一个文本转语音TTS(Text to Speech)的第三方软件封装,应用的是海内语音技术龙头安徽科大讯飞公司提供的离线引擎AiSound5.0,重要用于 ...
- 浅谈 JavaScript new 执行过程及function原理
前言 最近在学习JavaScript语言精粹,感觉写得相当不错.所以这里也算是总结一下.一个方法使用new的方式创建到底是怎样的过程,一个function的声明内部又是怎样执行的呢 另外学的过程中,不 ...
- Sipdroid实现SIP(二): 呼叫请求
INVITE 许多介绍sip的文章没有介绍以下几点细节: 重传, Timer A, B Transaction的有限状态机, 记录当前Transactin的进展情况 与INVITE消息相关的行为(Cl ...
- 挖坑:CF712E
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000005 using ...
- 打印java堆栈信息
使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...
- Linked List - leetcode
138. Copy List with Random Pointer //不从head走 前面加一个dummy node 从dummy走先连head 只需记录当前节点 //这样就不需要考虑是先new ...
- CentOS6.5部署L2TP over IPSec
一.环境介绍: 1.CentOS 6.5 (要求双网卡做软路由,如果只是做VPN可以单网卡) a.外网IP: b.内网IP: 2.Window 10 主机一台做为一台内网测试软路由使用: a.内网IP ...