MS 07004分析和利用

2021-04-13 08:42:50 字數 2516 閱讀 1115

文/圖  gyzy

相信大家對去年的ms06-055還記憶猶新吧,微軟的向量標記語言vml中的method變數ie未對其進行長度進行檢查,導致了乙個棧溢位漏洞。2023年的新年鐘聲剛剛敲響,又乙個關於vml的漏洞**了,cvmlrecolorinfo::internalload() 中的recolorinfo 方法中存在整數溢位,milw0orm上國外有人第一時間公布了poc**,無疑為我們的分析過程提供了方便,我們可以從二進位制補丁對比中定位到了出現問題的**,補丁中加了乙個對eax檢查的指令'cmp eax, 0x5d1745d',如圖1:

圖1

.text:6ff176a7 loc_6ff176a7:                           ; code xref: sub_6ff17642+21j

.text:6ff176a7                 mov     eax, [esi+8]

.text:6ff176aa                 add     eax, [esi+4]

.text:6ff176ad                 test    eax, eax

.text:6ff176af                 jle     short loc_6ff176c4

.text:6ff176b1                 imul    eax, 2ch

.text:6ff176b4                 push    101h

.text:6ff176b9                 push    eax             ; size_t

.text:6ff176ba                 call    sub_6fecfef4

.text:6ff176bf                 pop     ecx

.text:6ff176c0                 pop     ecx

.text:6ff176c1                 mov     [esi+14h], eax

eax是從html**中得到的,由於32位暫存器所能表示數的範圍是有限的,所以假如我們提交乙個很大的數,那麼乘以2ch以後就反而變小了,6ff176ba中的**呼叫了malloc申請堆記憶體,所以這個漏洞本質上來說是因為整數溢位而間接導致了堆溢位,那麼我們如何定位這一段**呢?我們首先在od中在上面這段**中下硬斷點,在命令列中輸入he 7ff176ad,然後開啟poc頁面,很快od斷了下來,如圖2:

圖2

然後跟進6fecfef4得到了malloc返回的指標003a8320,在這個位址上下寫斷點,hw 003a8320,斷在處,如圖3

圖3

push 0b pop ecx和下面的rep movs這三條指令是將rgb(x,x,x)(參見後面的exp)的顏色引數經過一定的演算法(下文簡稱rgb演算法)算出的結果拷貝到堆中,每次0b位元組。recolorinfo 中共有五個引數,分別是tocolor、lbcolor、forecolor、backcolor、fromcolor需要經過rgb演算法得出,0b*5=2c,我們可以猜測下面每個recolorinfoentry都會拷貝2c個位元組到堆中,我們來看看od下方的資料視窗來驗證一下我們的猜測,果然是從003a83fc處開始每2c(十進位制的44)位元組的資料都是重複的。然後我們按下f9鍵讓ie跑起來,od提示有異常,如圖4:

圖4

很明顯某些函式指標被覆蓋了,我們在記憶體中搜尋6e006f00,在00010101的地方發現了這串串行,而00010101就是出現在堆記憶體中的資料,假如我們能將指標指向我們的shellcode,嘿嘿...如何利用呢?這個漏洞又和普通的堆溢位的利用方式有點不同,傳統的堆溢位是通過二次alloc或free改寫rtlentercriticalsection 或者unhandled exception filter等指標來獲得**的執行權,而ie裡則可以通過一種「暴力擴張堆」的方法來獲得**執行權,就是連線成05050505+shellcode這樣的形式,堆是從低位址向高位址增長的,再看看堆中被我們覆蓋的資料,假如我們call的不是[00010101]而是[01010100]那就正好跳轉到了05050505這個位址,在一連串的add eax,5050505h指令之後,這些指令是無關緊要的,最終跳入了我們的shellcode中執行,堆中的資料都是由recolorinfo 中的一些引數得到的,具體的演算法我也沒有細細的跟,頭大啊,但rgb(x,x,x)的三個引數最終會直接決定函式指標的指向,網上公布的poc中rgb(1,1,1)生成的位址是00010101。另外這個漏洞因機子而異不會有100%的成功率,相信看到現在讀者朋友也該明白是什麼原因。然後我們把shellcode換成自己的down&exec的,關於怎麼寫shellcode大家可以翻翻黑防以前的文章。但是有一點就是記得前面要加4個nop,否則可能出現失敗的情況,因為連續的050505會破壞你的shellcode,需要幾個nop緩衝一下,害我鬱悶好一陣子,汗...我在中文xp sp2 + ie6下測試成功了,測試的**如下,測試結果如圖5:

圖6 -

MS 07004分析和利用

相信大家對去年的ms06 055還記憶猶新吧,微軟的向量標記語言vml中的method變數ie未對其進行長度進行檢查,導致了乙個棧溢位漏洞。2007年的新年鐘聲剛剛敲響,又乙個關於vml的漏洞 了,cvmlrecolorinfo internalload 中的recolorinfo 方法中存在整數溢...

深度 CVE 2017 8565分析和利用

本文講的是深度 cve 2017 8565分析和利用,如果你在最近的更新如 kb4025342 中看到以下三個關鍵字,請不要驚慌,保持冷靜,並閱讀新的安全更新指南門戶 上的cve 2017 8565 是的,cve 2017 8565於2017年7月11日發布。來自hewlett packard en...

狀態碼502和504分析

一.戲說 不管你是做運維還是做開發,哪怕你是遊客,時不時會遇到502 bad gateway或504 gateway time out。出現這頁面,把服務重啟下,再實在不行重啟下伺服器,問題就解決了,但是,這問題還是會困擾著你,特別是做運維的人員。夜黑風高正酣睡時,乙個 響起,讓你重啟服務或iisr...