CVE-2015-5122 簡要分析
最近在學習Flash漏洞的分析,其與IE漏洞的分析仍是有諸多的不一樣(不便)之處,折騰了一陣子終於克服了沒有符號表、Flash的超時定時器等問題。因此找到了去年HT事件其中的一個Flash漏洞,練練手,分析和學習。ide
測試環境:Win7 64bit+IE10+Flash 17.0.0.169函數
在exp開始的時候會先判斷系統是64位仍是32位,而後調用利用的關鍵函數TryExp1。佈局
在函數TryExp1中,其會先建立一個大小爲0x7e的Array,此時的Array在內存中的佈局:學習
建立Array後,接下來會將長度爲0x62的unit vector賦值給Array[0]~Array[1d],as代碼段:測試
建立的unit vector在內存中的分佈:
3d
此時的Array:
對象
&ArrayBuff[0~1d]:
blog
內存中Array[0]的值:
事件
接着爲Array[2e~7d]賦值,此次是長度爲8的unit vector,對應的as代碼:內存
賦值完畢後,Array的內存佈局.
&ArrayBuff[2e~7d]:
Array[2e]:
接下來TextLine對象賦給Array[1e~2d],代碼:
賦值結束後,Array的內存佈局。
&ArrayBuff[1e~2d]:
對Array的賦值都結束後,此時Array中的內容:
經過爲上面的TextLine設置opaqueBackground屬性,接下來會分配大小0x390的Backgroud對象。分配該內存的代碼段在IDA中的截圖:
經過對該代碼段設置斷點,能夠獲得全部建立對象的地址:
接着,程序會重載MyClass類的valueof方法爲valueof2,從新設置TextLine的opaqueBackground屬性,相關代碼段:
由於_mc是一個類,因此在設置opaqueBackground屬性的時候,valueof2函數會被調用。
這一過程當中,valueof2函數一共會被調用6次,造成一個嵌套調用,最後一次調用的時候,進入else分支中,完成Background object的釋放和unit vector的佔位。當valueof2函數返回的時候,還會對Backgroud操做,因此其返回值就有可能會寫入到某個unit vector的頭部。下面來具體分析一下這個過程:
這段執行完畢後,會釋放以前建立的5個Background object,利用windbg搜索和以前的object地址對比,就可以獲得釋放object的地址:
接下來使用大小爲0x190的unit vector,嘗試對剛釋放掉的Background object內存進行佔位。
至於爲何要使用0x190大小的內存進行佔位,是由於接下來會對object+320h位置進行賦值操做,這個偏移恰好是兩個unit vector的內存大小,這樣就有機會對unit vector的長度進行改寫。
能夠看到一個已經釋放掉了的Background object被unit vector佔據:
當valueof2函數返回的時候,會使用其返回值對object+320h進行賦值,IDA中的代碼段以下:
此時地址處的Background object已經被unit vector佔據,改寫unit vector的長度爲6a:
在獲得一個較大的unit vector以後,程序會利用這個vector改寫緊接其後的一個vector長度爲0x4000000:
在得到這一一個超大長度的vector以後,攻擊者就擁有了當前程序地址空間類,任意地址讀寫的能力了。
有點好奇Adobe是怎麼來補這個漏洞的,因此分析了一下補丁。
補丁前:
補丁後:
可見,Adobe將valueof函數的調用放在了得到Background object地址以前。這樣若是在valueof函數中,Background object被釋放掉了,在走到語句「mov [esi+320h], bl」以前,就會再從新爲其分配一塊內存。
這也再一次說明了,UAF漏洞從本質上來講就是時序問題。
by:會飛的貓
轉載請註明:http://www.cnblogs.com/flycat-2016