教学:Flash漏洞分析
在上面的分析中可以看到很多的术语和技术细节,为了帮助分析人员分析及应对这个漏洞,下面就结合此次Flash 0day漏洞,谈谈关于Flash方面的知识。
Flash背景知识
Flash又被称之为闪客,2005年12月3日被Adobe公司收购。Flash通常也指Macromedia Flash Player(现Adobe Flash Player)。 2012年8月15日,Flash退出Android平台,正式告别移动端。Flash是一种动画创作与应用程序开发于一身的创作软件,到2013年9月2日为止,最新的零售版本为Adobe Flash Professional CC(2013年发布)。目前用的最多的产品是Adobe Flash Professional CS6。
Flash动画说到底就是“遮罩+补间动画 +逐帧动画”与元件(主要是影片剪辑)的混合物,通过这些元素的不同组合,从而可以创建千变万化的效果。Flash是一个非常优秀的矢量动画制作软件,它以流式控制技术和矢量技术为核心,制作的动画具有短小精悍的特点,所以被广泛应用于网页动画的设计中,以成为当前网页动画设计最为流行的软件之一。
Flash影片的后缀名为.swf, swf在发布时可以选择保护功能,如果没有选择,很容易被别人输入到他的原始档中使用。
“fla”是Flash的原始档,只能用对应版本或更高版本的Flash打开编辑。
ActionScript是一种程序语言的简单脚本文件,.fla原始档能够直接包含ActionScript,但是也可以把它存成AS档做为外部连结档案(如定义ActionScript类则必须在写在as文件里,再通过import加入类),以方便共同工作和更进阶的程序修改。
而对于一般的Flash方面的漏洞集中于ActionScript脚本解析执行的漏洞利用。目前AS的最高版本是AS3.0。
16 | 31
Flash文件格式
对于Flash文件,其实和我们平时用的PE文件,ELF,及Dex文件类似,也是由一定格式的数据结构组成。Flash文件的扩展名为.swf,其头部格式如下图
再好的说明也没有实际的例子理解的深刻,那我们就结合两个实际Flash的swf文件看看SWF头部结构,如下图所示:
17 | 31
根据对swf文件头部的介绍,不需要大篇幅的文字来说明swf文件头部的结构,结合上面的两幅图,来自于两个不同的文件,exp1.swf,exp2.swf。可以清晰的看到swf文件的的总体结构。
图中的两个swf文件,一个是压缩过的exp1.swf,一个是未压缩的exp2.swf。exp1.swf和exp2.swf由同一个fla原始档和AS脚本编译而成;exp1.swf被压缩,exp2未被压缩。从下图也可以看到两个文件大小的对比情况:
上面两幅swf解析图来自于二进制查看工具010 Editer的截图,在官方下载swf.bt模板,导入010 Editer工具中,打开swf文件,运行模板插件即可识别出二进制文件类型及结构。
简单介绍一下,根据文件头部的说明,文件头部的前三个字节是标识符的开始位为0x46、0x57、0x53(“FWS”)或者0x43、0x57、0x53(“CWS”)其中之一。 “FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方式压缩,如上图exp1.swf所示;标识符之后是一个字节的版本号,这个版本号并不是一个ASCII码,而是一个8位的数字,比如,图中显示的版本值是0x0F。
文件长度字段是整个包含文件头在内的文件字节长度,如果是未压缩的SWF文件(标识符FWS),那么长度字段应该是和文件大小恰好匹配,如果是一个经过压缩的SWF文件(标识符CWS),那么文件长度字段是指文件经过解压缩之后的总长度,因此它一般不会和文件大小匹配,若果使用未压缩的文件尺寸能够让解压过程获得更高的效率,从上图中的exp1.swf看出使用了未压缩文件大小76528,和exp2.swf一样的大小。
帧率是以帧每秒为单位的帧回放比率,在exp2中给出的帧率是12,但是在压缩文件exp1中已经被压缩,压缩算法是zlib. 帧数是整个SWF影片帧的总数量。从图中看出,在压缩文件exp1也已经被压缩。文件头之后是一系列连续的标签数据块,所有的标签都共享一种通用格式如下图:
18 | 31
Exp2文件的一个整体结构如下图所示:
对swf文件格式的简单介绍就到这里,标签的具体内容这里就不做深入解读了。对于如何查看压缩之后的swf文件内容,会在后面介绍。
Flash常用工具介绍
对于Flash常用工具,包括编译工具、反编译工具等。这里结合HackingTeam给出的Flash0Day漏洞源码来学习一些常用的Flash工具。
编辑编译工具:CS
这款工具就是Flash编辑工具CS6.0,也是目前制作Flash动画使用最多的一款工具。该工具具有针对AS脚本简单的调试功能。结合Hackingteam给出的源代码,让CS6.0直接加载源代码中的.fla原始档文件。之后直接运行“Ctrl+Enter”会在源代码目录下生成.swf文件。当然该.swf文件包含了AS脚本的ABC字节码内容;编译后的结果如下图所示,由于在给的Flash0Day漏洞源码中已经给出了一些调试信息,所以在点击“run cale.exe”后,所有出现了一些调试信息,如图所示:
19 | 31
该工具还提供简单的调试功能,为了能够查看和调试AS源码文件,可以同时打开AS源码,加入调试信息或是设置断点来调试AS源码,如图所示
压缩与非压缩SWF文件
从前面看到的贴图知道,对于SWF文件有压缩格式与非压缩格式,那么为什么会有压缩格式与非压缩格式。在CS5.0以前产生的swf默认都是非压缩格式。如果需要对swf文件压缩需要借助其他的swf压缩工具,比如说MinifySWF,Flash Optimizer,LiatoSWF等;而在CS6.0,集成了lzma(7-zip)和zlib压缩算法,对编译的swf文件默认都是压缩格式,所以我们看到的HackingTeam默认编译的exp1.swf是一种压缩格式。
如果想编译出非压缩格式的swf文件,方法也很简单,只需要在发布影片时设置非压缩即可,如下图所示
20 | 31