反编译工具:AS Sorcerer
对于已经发布的swf文件,都不会带有源码,对我们调试swf文件就带来了不小的麻烦,类似分析Android的DEX文件,都是执行在虚拟机中,由虚拟机来解释执行字节码。DEX文件由反编译工具可以反编译出java源码,那么swf文件也有类似的工具,根据SWF文件格式和ABC字节码反编译出类源码的文件。
Swf反编译工具也比较多,这里举个例子利用AS Sorcerer工具来将编译好的swf文件重新解析,下图是HackingTeam爆出了Flash0Day源码
21 | 31
从图中知道,根据exp1.swf文件大小可知,HackingTeam自己编译的是zlib压缩后的文件,当然也可以通过二进制直接看看有没有被压缩,根据前面介绍的知识,只要二进制文件前三个字节是“CWF”那就是压缩后的文件。
接下来我们用AS Sorcerer工具来反编译exp1.swf文件看反编译后的结果:
从反编译结果来看,该工具确实还原了原有的几个AS文件,同时也说明该工具能自动解压由zlib压缩的swf文件,并对swf文件进行反编译解析。
反编译工具:Sothink SWF Editer
接下来再介绍一款反编译工具---硕思闪客精灵,该工具比上一个款工具有更直观的界面,同时重要了一点就是提供了一款swf文件编辑工具Sothink SWF Editer,不但能识别swf文件结构,而且可以直接编译swf的二进制文件。
先来看反编译工具硕思闪客精灵反编译exp1.swf文件的界面情况:
22 | 31
从图中可以看出该工具将压缩格式的swf文件,直接反编译,同时看到了ABC字节码在反编译后的源码情况。
前面我们提到过对于压缩后的swf文件,010 Editer即使使用了swf模板,也不能解析出压缩后的文件格式。这里就介绍一款能够查看SWF压缩后文件格式的工具,Sothink SWF Editer工具可以直接将压缩的swf文件,解压同时解析出文件结构,如下图所示:
从图中看出压缩的swf文件,在导入该工具后自动解压并识别为FWS文件。而非CWS文件,为我们分析没有源码的并压缩的SWF文件,提供便利。
23 | 31
反编译工具:其他
还有其他的一些反编译工具比如yogda,asv,swf decmpiler, decompile Flash free,swf deompiler magic等就不一一列举介绍。
AS脚本
AS(Action Script)是Flash动作脚本语言,类似于JS(JavaScript)脚本语言,所以在很多存储结构和对象使用上都可以参考JS脚本语言的使用方式。下面结合本漏洞中会用到的一些结构对象做简要介绍。
AS中数组的使用
对于AS中的数组我们需要知道AS数组不像C/C++中的数组,在C/C++中数组要求存储同种类型的数据,而在AS中可以存储不同类型的数据,可以是基本数据类型也可以是对象类型也可以是自己定义的类型。在本例将要提到的AS中,数据Array就同时存储了ByteArray和MyClass2两种数据类型。
AS中Vector存储形式
在AS中,Vector只能存储同一类型的元素,其一般使用的格式如下:
1 var v:Vector .
Vector类构造函数有两个可选参数,它允许你明确你的Vector实例的数量。第一个参数是length参数。默认情况下,当一个Vector被创建时,它是空的(它有0个元素)。然而,如果你传递一个值给length参数,明确元素数量的Vector实例就被创建了:
1 var myVector:Vector.
24 | 31
Vector对象的另一个特征就是他们可以调整长度,这意味着你可以改变值,但是不能通过添加或删除元素来改变总数。默认地,一个Vector实例是不允许动态修改长度的。要创建一个可修改长度的Vector,将Vector类构造函数的第二个参数(fixed参数)设置为true:
1 var myVector:Vector.
注意: 可以在任何时候修改Vector对象的fixed属性来设置Vector的长度是否可变。
1 myVector.fixed = false; // myVector's length is no longer fixed
uint Vector在内存中的布局如下图,Uint vector包含了8字节的头部信息,其中4字节是长度字段。
AS中对象类型转换
在AS通用对象属性中有两个特殊的方法ToString()方法和ValueOf()方法。
ToString方法没有参数,它返回一个某种程度上代表着对象值的一个字符串,而它正是在这个对象上调用的。当AS需要将一个对象转换为一个字符串对象时,就需要调用该函数。比如当使用+运算将一个字符串和一个对象链接起来,或是当期待一个字符串的函数Alert传递一个对象的时候就会默认调用该函数。
ValueOf方法和ToString方法类似,它是当AS需要把一个对象转换为某种基本数据类型时就会调用该方法。比如一个对象用在需要一个基本数值的环境中,AS会自动调用该函数,而在本文提到的漏洞中正式利用了这一点,在将一个对象Myclass转为字节类型时默认调用Myclass的ValueOf方法。
25 | 31