关于SWF那个著名的漏洞

作者:zodiacsoft
来源:天鹅糊&&乌鸦酱

[Toooooooooooooooooold]

也就是CVE-2007-0071,flash9x.ocx存在问题,版本一直影响到9.0.115。
漏洞本身很简单,Dowd的思考方向没有脱离大众,但关键在于相当牛逼的一系列利用技巧。具体的细节Dowd写了一篇很棒的paper,估计很多人看了, 也有很多人做了。文章我仔细拜读了一次,但出于某些原因,没有去动手做出最后的成品,以后也不打算做,这个东西不是手把手说怎么触发利用的,而是一些关于 那篇文章的勘误和另一些周边小问题的补充。

第一个障碍是swf文件格式,这个大概会花费你两到三个小时的时间。推荐下载一个Sothink SWF Decomplier,当然最好还要一个Flash CS3。参考文献当然是Adobe自己公开的SWF文件格式pdf。
同很多文件格式一样,SWF由头和一系列的块组成。SWF又分压缩和非压缩两种,但两者都保留了基本的头块,压缩方式是zlib,可以用标准的zlib来解压,压缩的SWF先处理一下比较好(或者导出的时候选择非压缩方式),这样原始的数据看起来会方便些。
块格式有各种各样的标示和数据,大多数情况下标示用6个字节,后4个字节表示长度,有时候为了节约,当块长在63字节以内的时候也用两个字节来表示标示和 长度,这个有点麻烦,需要计算一下。还有一种变长的数字表示形式,最长用5个字节来表示一个32位整型,也是为了节约,这个也有点麻烦,手算肯定麻烦,还 是要写个程序自己算。
过了文件格式解析这一关,大概也写出一个能够parse各个块的程序了,最好能拆开各块分成文件,然后能组装起来,后面手工编辑方便很多。

第二个障碍是ActionScript,这个地方要花多少时间就难说了。参考文件当然是Adobe自己的pdf,不过也就是拿来当个手册用,只要记住0x62 0x63 0x47等字节码的功能就可以了。
先说那个所谓的MaskTable。这个是用于检查你的AS是否合法的一张表,基本上可以理解为一个char[255],小于零表示这个操作数不存在,大 于零基本表示这个操作数的参数长度。例如0x47对应表偏移0x47的值是0,说明这个操作数(0x47)没有参数。所以修改这个表相当于修改了检查规 范,比如修改偏移0xF9为0x20,那检查的时候检查到0xf9操作数的时候就会跳过0x20个字节,就可以掩盖这中间一些邪恶的操作。由于检查和执行 是分离的,而本身不存在的操作是不执行的,所以检查过了,执行的时候就可以干些坏事情,因为不存在的操作,比如0xf9等,就是单纯跳过一个字节而已。
最简单的一段AS字节paper中给出来了,简单解释一下,第一个是保存eip用来以后恢复上下文;第二个是取个指针,准备用来修改eip的,很巧,这个 指针刚好是指向下一条要执行的AS字节;第三条比较关键,需要是一个跳转,因为这个地址会被覆盖到eip,也就是获得控制后首先执行到的,至于他的AS字 节的意义,可以随意,最好是个nop like的操作,第四、五个是写指针到栈上保存的AS解析函数返回地址的,最后当然是个AS中的ret,让AS解析函数返回并获得控制。
需要注意的是,Dowd给出的并不是最佳的方案,而是最容易理解的方案,所以理解后最好别用这种Marker+双意操作的,另外可以有更简单的办法。
关于Mask那个表,各个版本的控件可以通过搜索相关的字符,基本上还是很容易找到的。解析的地方可以下Mask的读断点,执行的地方可以在IDA中搜索一个很大的switch case,断点可以下指令等于给定Marker的条件断点,这些就不具体说了。

有时候可能会遇到第三个障碍,就是明明通过了检查但是没有执行。这个似乎最好别用自己在Flash CS3中编辑的函数来修改,直接用它本身AS字节码的来修改。

恢复上下文保证功能执行完毕后程序流程正常就不说了。

关于其他平台和浏览器,以及不同版本的flash的问题,Dowd很明显是有误导的嫌疑。因为你必须写一个地方,这个地方不同的版本不一定是可写的,所以不同版本很容易就直接挂了,因此就算你能多次触发,乱七八糟地写,也没用,特别是高一点的版本这个问题表现尤其明显。
关于失败。失败的情况是有的,控件本身没有被随机加载,但是如果flash9x.ocx默认加载地址被占用了,也挂了。看这个的第一眼就发现和 office系列冲突,所以office利用是很困难的。如果你非要一试,可以考虑下宏什么的,有好也有不好。嵌入swf的时候,xls打开就可 以,word打开还要点一下关闭编辑,这个问题也要解决。

个人觉得这个swf做出来可以毫无反应地让对方浏览器中标,而且总共就500来个字节,确实是很黄很暴力,希望国内别来这么一下,实在是有点恐怖。

相关日志

发表评论