來自CVE的漏洞描述:
測試環境: Win7 SP1 + Flash ActiveX 15.0.0.167
介紹有關漏洞關鍵代碼前,先看一下heap spray后的內存布局:
簡單描述為:
漏洞致使Uint Vector的length字段被改寫。
漏洞關鍵代碼:
紅線標注的部分其操作流程:
取預定大小0×1000的ByteArray對象_loc3,賦值給domainMemory,以便casi32函數操作此內存
預置大小0×1000的ByteArray對象:
通過函數atomicCompareAndSwapLength將_loc3長度置0
casi32函數內由于整數溢出造成執行流改變,致使向_loc3偏移0×1000處成功寫入0×40000001
上述過程細節:
這樣就可以以超長的Uint Vector為起點,讀取預置的對象數據。
利用關鍵點:
搜索預置的sound對象進而計算出flash控件基址
預置的sound對象包含于噴射的少量Vector Object里,這里稱之為vec_3。
具體的噴射代碼:
通過特征比對遍歷以獲取vec_3中元素:
搜索到的其中一項:
計算flash控件基址:
在flash控件基址基礎上獲取rop鏈所需指令,用VirtualAlloc分配可執行內存過DEP。
構造rop鏈(部分):
修改sound對象虛表指針,并調用修改后的虛表函數將執行流導向stack pivot。
sound對象虛表指針修改前后:
修改后的虛表指針指向內容:
調用虛函數觸發利用。
完整的利用至少由兩部分組成(html + swf),其中swf并不能獨立執行,需要html傳入的參數(shellcode),只拿到swf并不能獲知攻擊者的意圖。