CVE-2019-0808的调试

poc是公布的 感谢大佬 我精简了一下 删除了一些代码

这个漏洞还是跟消息机制有关 NtUserMNDragOver产生了NULL指针引用,归根结底还是r3hook了WINDPROC更改了TackPopMenu的父窗口 所以xxxMNFindWindowFromPoint查找的时候错了,完了以后xxxMNUpdateDraggingInfo要去获取tagWND里的tagPoPMenu结构体 众所周知 我们已经把menu的主窗口句柄替换了,fakeWnd是没有TackPopMenu的,所以这里的tagPoPMenu是NULL,从以下ida分析可以看出 流程是窗口的tagWND->tagPoPMenu->spmenu.

 unsigned int __stdcall MNGetpItem(tagPOPUPMENU *a1, unsigned int a2)
  {
  tagMENU *v2; // ecx@2
  unsigned int result; // eax@3

    if ( a1 && (v2 = a1->spmenu, a2 < v2->cItems) )
      result = (unsigned int)&v2->rgItems[a2].fType;
    else
      result = 0;
     return result;
  }

然而hook替换的tagPoPMenu是NULL。所以crash

以下是windbg分析

  win32k!MNGetpItem+0x12:
  96dcdd22 3b4120          cmp     eax,dword ptr [ecx+20h]
  0: kd> dd ecx
  00000000  ???????? ???????? ???????? ????????
  00000010  ???????? ???????? ???????? ????????
  00000020  ???????? ???????? ???????? ????????
  00000030  ???????? ???????? ???????? ????????
  00000040  ???????? ???????? ???????? ????????
  00000050  ???????? ???????? ???????? ????????
  00000060  ???????? ???????? ???????? ????????
  00000070  ???????? ???????? ???????? ????????


  0: kd> k
   # ChildEBP RetAddr  
  00 bf20faa0 96dce8ba win32k!MNGetpItem+0x12
  01 bf20fad0 96d99451 win32k!xxxMNUpdateDraggingInfo+0x7b
  02 bf20fb0c 96d99066 win32k!xxxMNMouseMove+0x62
  03 bf20fb68 96dce233 win32k!xxxHandleMenuMessages+0x2ed
  04 bf20fba4 96dce78d win32k!xxxCallHandleMenuMessages+0x8d
  05 bf20fbd4 96dbc71e win32k!xxxMNDragOver+0x7f
  06 bf20fc24 8487a1ea win32k!NtUserMNDragOver+0x4a
  07 bf20fc24 77bf70b4 nt!KiFastCallEntry+0x12a
  08 0030f690 76214d43 ntdll!KiFastSystemCallRet
  09 0030f694 00f216fa user32!NtUserMNDragOver+0xc

这种hook替换 “#32768”的窗口create(这种创造 很多tagWND结构体成员设置位0) hWndFakeMenu = CreateWindowA (“#32768” ,“MN” ,WS_DISABLED,0 ,0 ,1 ,1 ,nullptr ,nullptr ,HINST,nullptr );感觉怎么说 套路? 学习这种套路 ,然后多运行代码
个人调试的几个漏洞与Window HOOK SetWindowLongPtr函数有关 应该先学会SetWindowLongPtr的参数使用方法在内核调试看它的几个分类是怎样操作的,我这两天调试的漏洞都是类似的手法 HOOK截获消息 SetWindowLongPtr 更改,xxxMNFindWindowFromPoint找错或者没有正确判断对象导致的crash 。我调试了上面说的我也懂HOOK和消息机制 所以我现在主要做的是poc触发漏洞 然后回溯分析。

你可能感兴趣的:(CVE-2019-0808的调试)