欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Flash漏洞利用之“喜闻乐见”

来源:本站整理 作者:泰格实验室 时间:2017-07-25 TAG: 我要投稿

道德三皇五帝,功名夏后商周。五霸七雄闹春秋,秦汉兴亡过手。

青史几行名姓,北邙无数荒丘。前人田地后人收,说甚龙争虎斗。

上回书,我们讲了二进制漏洞的攻防对抗过程,最后提到了Flash漏洞利用(前一篇文章传送门)。由于篇幅限制,Flash漏洞利用这一块没有详细展开。这回书,我们着重展示下Flash漏洞利用的“喜闻乐见”。说到这里,各位看官可能会想:“什么喜闻乐见,故弄玄虚!”

别急,且听我徐徐道来。

0×0 大牛的“喜闻乐见”
漏洞这一块其实分三个小方向,漏洞挖掘、漏洞分析和漏洞利用。本人主要做的是漏洞利用这一块,不了解漏洞原理的话,自然是无法做出好的利用。因此少不了看一些大牛的漏洞分析文章,这也正应了那句话——“前人田地后人收”。某一日,看到了古河大牛的一篇文章《CVE-2014-0569漏洞分析》http://www.weibo.com/p/1001603769606924861349。
大牛的文章,自然是器宇不凡。先是指出了CVE-2014-0569的漏洞成因,然后科普了下casi32函数,之后详细介绍了样本中casi32函数如何造成了溢出,最后介绍了下漏洞利用方式:

由于当时刚接触Flash漏洞利用,大牛口中的喜闻乐见,对我等小菜来说却毫无头绪。当时的心情可以用下面这句话来形容:
金莲顿时脸泛红晕,涡生梨颊,骨软筋酥,欲火如炽,一刻难挨。当下打熬不住,柔荑一张,便往大牛胯下探去。谁知五指所触,空然无物,大惊道:“大牛,如何下面没有了?”
这里只是借用下网络段子表达下无奈的心情,无意冒犯大牛哈。不同于以往的IE、JS引擎的漏洞等,Flash漏洞需要将Action Script文件编译成swf,仅仅是编译就会令不少新手走很多弯路,更别说Action Script各种知识。Flash漏洞这一块,存在一个这样的现象:懂漏洞的不懂Flash,懂Flash的不懂漏洞。
对于初次接触Flash漏洞的人,用举步维艰来形容,我觉得一点也不过分。相信大牛也是从懂漏洞不懂Flash一步一步走过来的,因此只有一点一点的学习,才能最终理解大牛的“喜闻乐见”。
这里先普及一些漏洞方面用到的Action Script知识。
0×1 Action Script
Action Script是为Flash开发的一种脚本语言,大量应用在需要交互的Flash游戏方面。对于漏洞研究来说,主要用到的是内存操作的一些知识。
Flash漏洞利用过程普遍会用到堆喷射技术,堆喷的目的是产生一片连续不间断的内存空间供漏洞利用使用。为了产生连续不间断的内存空间,要点在于申请空间的时候,每个元素的大小为诸如0×1000的倍数,一般使用ByteArray或者Vector来实现。Vector可以理解为一种特殊的数组,不同类型的Vector,有着不同长度的头部数据。这里先罗列几个知识点,为后续代码讲解作铺垫。
1)Vector.
每个Vector.有8字节BlockHeader,其中前4个字节是size字段。堆喷为了对齐,申请的uint个数为0x3FE。0x3FE*4 + 8 = 0×1000。
2)Vector.结构
0×0

0×14    指向本vector的0×18偏移,一般用来定位本vector的头部地址
0×18
0x1C
0×20 vtable   函数指针列表,覆写vtable后调用对应的函数实现执行ROP
0×24 length   覆写此值为0xFFFFFFFF,就可以实现任意地址读写
0×28 elements[]      the_vector[0]   
0x2C                 the_vector[1]
0×30                 the_vector[2]

可以看出Vector.前0×24/4 = 0xA个Dword为头部,一般申请0x3F6数量的Object,这样(0x3F6+0xA)* 4 = 0×1000。其中:
3)vtable
vtable为Vector对象虚函数表的指针。通过任意地址读写,构造虚函数表,将某个偏移(如0×70)写入ROP链地址,然后将虚函数表的指针覆盖掉Vector头部的vtable字段。这时调用Vector对象的方法(如toString()),实际执行的为ROP链地址。
4)ByteArray
另一个需要了解的就是ByteArray的数据结构,根据不同版本,在ByteArray对象的+0×40 or +0×44 or +0×48会有一个m_buffer,而m_buffer的+0×8保存了真正保存数据的array,+0×10是length。m_buffer具体如图所示:

5)casi32
casi32是ActionScript3里面用来操作domainMemory的函数之一,domainMemory是用来加速内存读写操作而加入的工具类。
casi32的函数定义如下:casi32(addr:int, expectedVal:int, newVal:int):int
第一个参数addr表示操作的内存地址(相对于domainMemory),第二个参数expectedVal表示要比较的值,而最后一个参数newVal是要交换的值。
以上为Flash漏洞利用的一点点基本知识,现在不理解没关系,可以结合下一节的代码解析再回来参考。
0×2 CVE-2015-0311
作者在搜寻POC/EXP的过程中,偶然在一个韩国网站上发现CVE-2015-0311和CVE-2015-0313的EXP。其代码编写规范、优美、复用性高,漏洞利用过程不拖泥带水一气呵成,堪称经典(不确定是否是他们原创,也有可能是借鉴别人的代码)。不多说,请看代码:
package
{
import flash.display.Sprite
import flash.system.ApplicationDomain
import flash.utils.ByteArray
import avm2.intrinsics.memory.casi32

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载