CVE 2018 8373相關利用雜談

2022-06-28 01:54:11 字數 1768 閱讀 7352

前段時間趨勢披露了vbs引擎的在野0day cve-2018-8373,當時中心第一時間披露了該次攻擊和darkhotel的關聯,上週花了段時間將該漏洞的exp構造出來,如下所示,目前來看uaf佔位上不是太穩定,後續會繼續改進,構造exp的時候遇到一些坑,遂找時間記錄一下。

利用思路上趨勢的文章中其實已經介紹得很清楚,在default  property中通過乙個二維陣列array1對釋放的array(2)記憶體進行佔位,並返回乙個大的0x0fffffff值,當cls.array(2) = cls賦值時,該0x0fffffff會寫入到array(2),由於該array(2)的記憶體空間之前巧妙的被二維陣列array1佔據,寫入到0x0fffffff正好將該二維陣列的其中一維長度被設定為0x0fffffff。

通過該array1(0x0fffffff,2)建立乙個超長的fakearray,從而實現全域性記憶體讀寫(期間需要在array1中搜尋兩個特殊的index,可以使用銀雁冰同學之前提供的方法,即暴力的type型別搜尋)。

這個地方遇到的坑就是構造的時候最好不要在打了cve-2018-8174的機器上測試,如下所示是我們正常構造的array1二維陣列,其中紅框對應的具體的兩個維數(紅框),我們的目標就是通過cls.array(2) = cls修改這兩維。

返回的資料如下所示,這是乙個int型別變數的記憶體結構,其數值為0x0fffffff,可以看到綠色部分不為0(而是改為了c0),第乙個紅框中的8個位元組的高位元組也不為0(同樣也是c0),注意這樣的記憶體結構是固定的。

這就導致之後cls.array(2) = cls返回二維陣列被修改如下,但是這樣的二維陣列的記憶體結構是有問題的,此時你直接操作該二維陣列將導致報錯(陣列越界,超過0x0fffffff)。

如下所示可以看到乙個標準利用時被修改的array1的記憶體結構應該如下(該圖來自於趨勢科技的原文),通過後來的除錯發現,8174之前的補丁0x0ffffff對應的記憶體結構就是下圖紅框所示(雖然綠框中0部分有時也不為0,但是其整體的值不會大於0x0ffffff)。 

但是打過8174補丁之後,其中綠色的部分會被填充上資料(固定填充),從而導致之後難以利用。

其主要原因在於cscriptruntime物件的local variables在補丁之後會初始化為c0的形式。

而變數的初始化時直接在這塊記憶體上進行的,如下可知對int型別的變數只是簡單的將3,4位元組賦值為0003(int的type型別),8-c賦值對int的實際值,其餘位置預設為記憶體的初始化值c0。

因此這裡我挺好奇當時趨勢抓獲的樣本中是否有相應的技巧將0x0ffffff變數的記憶體進行規範化,還是說他們當時測試的時候是在沒有打8174補丁的機器上進行,如果是第二點的話,該漏洞的利用似乎在打了8174補丁上的機器上是無法利用的(如果不能很好解決變數初始化時的c0問題)。

參考

6 8 相關工具

位元幣相關工具包括客戶端 錢包和礦機等。1.客戶端 位元幣客戶端用於和位元幣網路進行互動,同時可以參與網路的維護。完整客戶端 儲存所有的交易歷史記錄,功能完備 輕量級客戶端 不儲存交易副本,交易需要向別人查詢 位元幣客戶端可以從 基於位元幣客戶端,可以很容易地實現使用者錢包功能。2.錢包 位元幣錢包...

2011相關概念題

資料型別是一組性質相同的具有一定範圍的值集合以及定義在這個值集合上的一組操作。資料型別既有內部資料型別,如int char float bool等,也有自定義外部資料型別,如列舉型別 結構型別 聯合型別 類型別等。adt即abstract data type 抽象資料型別 是基於已有型別組合而組成的...

MySQL Python相關 day02相關題目

1示例 create database moshou use moshou create table hero id int,name char 15 enum 男 女 country char 10 default charset utf8 insert into hero values 1,曹操...