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在内存中的布局:

928323-20160418234650257-1571364069.png

2. Set Array[0~0x1d]

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

928323-20160418234708132-667239540.png

创建的unit vector在内存中的分布:
928323-20160418234730413-439107318.png

此时的Array:
928323-20160418234751491-633552014.png

&ArrayBuff[0~1d]:
928323-20160418234800976-598526613.png

内存中Array[0]的值:
928323-20160418234820351-441415847.png
928323-20160418234835960-726192700.png

3. Set Array[2e~7d]

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

928323-20160421221452476-1481085959.png

赋值完毕后,Array的内存布局.
&ArrayBuff[2e~7d]:
928323-20160421221916601-558316809.png
Array[2e]:
928323-20160421221939929-1354504287.png

4. Set Array[1e~2d]

接下来TextLine对象赋给Array[1e~2d],代码:
928323-20160421221952585-936331397.png

赋值结束后,Array的内存布局。

&ArrayBuff[1e~2d]:
928323-20160421223011163-1120262522.png

5.Set Array Value Over

对Array的赋值都结束后,此时Array中的内容:
928323-20160421223036304-891936040.png

6. Allocate Background object

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

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

7. override valueOf method and call it

接着,程序会重载MyClass类的valueof方法为valueof2,重新设置TextLine的opaqueBackground属性,相关代码段:

928323-20160421223136304-589318742.png

8. my valueof method

因为_mc是一个类,所以在设置opaqueBackground属性的时候,valueof2函数会被调用。

这一过程中,valueof2函数一共会被调用6次,形成一个嵌套调用,最后一次调用的时候,进入else分支中,完成Background object的释放和unit vector的占位。当valueof2函数返回的时候,还会对Backgroud操作,所以其返回值就有可能会写入到某个unit vector的头部。下面来具体分析一下这个过程:

9. free Background object

928323-20160421223309070-347057619.png

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

10. occupy the freed memory

接下来使用大小为0x190的unit vector,尝试对刚释放掉的Background object内存进行占位。

至于为什么要使用0x190大小的内存进行占位,是因为接下来会对object+320h位置进行赋值操作,这个偏移刚好是两个unit vector的内存大小,这样就有机会对unit vector的长度进行改写。

可以看到一个已经释放掉了的Background object被unit vector占据:
928323-20160421223429273-1473327999.png

11. set Background value

当valueof2函数返回的时候,会使用其返回值对object+320h进行赋值,IDA中的代码段如下:
928323-20160421223444710-908208485.png

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

928323-20160421223518085-1592317475.png

12. get big unit vector

在得到一个较大的unit vector之后,程序会利用这个vector改写紧接其后的一个vector长度为0x4000000:
928323-20160421223635273-905461431.png

在获得这一一个超大长度的vector之后,攻击者就拥有了当前程序地址空间类,任意地址读写的能力了。

补丁对比

有点好奇Adobe是怎么来补这个漏洞的,所以分析了一下补丁。

补丁前:
928323-20160421223956288-159153091.png

补丁后:
928323-20160421224004695-375545572.png

可见,Adobe将valueof函数的调用放在了获得Background object地址之前。这样如果在valueof函数中,Background object被释放掉了,在走到语句“mov [esi+320h], bl”之前,就会再重新为其分配一块内存。

这也再一次说明了,UAF漏洞从本质上来说就是时序问题

by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016

转载于:https://www.cnblogs.com/flycat-2016/p/5406457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值