悬空指针 - 发现对象何时被创建

3
我正在使用windbg调试一个软件的Use-After-Free漏洞(没有源代码访问权限)。

在哪里

An Object Created --(do something)--> Object Deleted  --(do something)--> Object Reference Re-used [App. CRASHHHH!!!] 

使用windbg和“PageHeap”可以轻松地找出对象何时被释放(!heap -p -a 0xXXXXXXX)和重新使用。
我的问题是,有哪些方法可以找出对象何时被创建。
谢谢。

只需找到构造函数并设置断点。 - paulm
1个回答

3

有一个很棒的技巧,可以使用(也许是滥用)泄漏跟踪来保存分配堆栈跟踪,并在调试器中查看它们。

既然您已经启用了 pageheap,这应该很容易解释。

  • 打开 gflags.exe(它随 Windbg 一起提供),并更改进程图像文件的标志。
  • 勾选 启用页面堆创建用户模式堆栈跟踪数据库 的框,然后单击应用。 glfags.exe with pageheap and ust checked.
  • 关闭并重新启动应用程序,以使新设置生效。
  • 附加 Windbg 并运行 !heap -p -a <allocation address you want the callstack of>

我在notepad.exe的堆栈中的一个堆分配上运行它,得到了这个结果:

0:000> !heap -p -a 00000261`1a43b6c8
    address 000002611a43b6c8 found in
    _DPH_HEAP_ROOT @ 26119821000
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
                             26119847750:      2611a43b6c0              938 -      2611a43b000             2000
          COMDLG32!CFileOpenSave::`vftable'
    00007ffa890622c7 ntdll!RtlDebugAllocateHeap+0x0000000000000047
    00007ffa88ff79ce ntdll!RtlpAllocateHeap+0x00000000000000ee
    00007ffa88ff595f ntdll!RtlpAllocateHeapInternal+0x000000000000064f
    00007ffa884c0f38 COMDLG32!CFileOpenSave::s_CreateInstance+0x0000000000000088
    00007ffa884d6750 COMDLG32!`CommonPrintDialogTelemetry::Instance'::`2'::`dynamic atexit destructor for 'wrapper''+0x00000000000103c0
    00007ffa886ffee7 combase!CServerContextActivator::CreateInstance+0x0000000000000207 [d:\th\com\combase\objact\actvator.cxx @ 872]
    00007ffa8876c0b3 combase!ActivationPropertiesIn::DelegateCreateInstance+0x00000000000000e3 [d:\th\com\combase\actprops\actprops.cxx @ 1926]
    00007ffa88700687 combase!CApartmentActivator::CreateInstance+0x00000000000000c7 [d:\th\com\combase\objact\actvator.cxx @ 2168]
    00007ffa886ff3e9 combase!CProcessActivator::CCICallback+0x0000000000000079 [d:\th\com\combase\objact\actvator.cxx @ 1631]
    00007ffa886ff504 combase!CProcessActivator::AttemptActivation+0x0000000000000064 [d:\th\com\combase\objact\actvator.cxx @ 1518]
    00007ffa886ff5e0 combase!CProcessActivator::ActivateByContext+0x00000000000000b0 [d:\th\com\combase\objact\actvator.cxx @ 1364]
    00007ffa886ff900 combase!CProcessActivator::CreateInstance+0x0000000000000090 [d:\th\com\combase\objact\actvator.cxx @ 1262]
    00007ffa8876c104 combase!ActivationPropertiesIn::DelegateCreateInstance+0x0000000000000134 [d:\th\com\combase\actprops\actprops.cxx @ 1926]
    00007ffa8876929a combase!CClientContextActivator::CreateInstance+0x000000000000015a [d:\th\com\combase\objact\actvator.cxx @ 561]
    00007ffa8876c0c6 combase!ActivationPropertiesIn::DelegateCreateInstance+0x00000000000000f6 [d:\th\com\combase\actprops\actprops.cxx @ 1978]
    00007ffa88760c61 combase!ICoCreateInstanceEx+0x0000000000000c91 [d:\th\com\combase\objact\objact.cxx @ 1817]
    00007ffa8875fea7 combase!CComActivator::DoCreateInstance+0x0000000000000147 [d:\th\com\combase\objact\immact.hxx @ 376]
    00007ffa8875fd0c combase!CoCreateInstance+0x000000000000019c [d:\th\com\combase\objact\actapi.cxx @ 120]
    00007ff6d5321be8 notepad!InvokeOpenDialog+0x000000000000004c
    00007ff6d53225d7 notepad!NPCommand+0x00000000000003b7
    00007ff6d53238a9 notepad!NPWndProc+0x0000000000000509
    00007ffa88a41169 USER32!UserCallWinProcCheckWow+0x00000000000001f9
    00007ffa88a40c97 USER32!DispatchMessageWorker+0x00000000000001a7
    00007ff6d5323ba1 notepad!WinMain+0x0000000000000269
    00007ff6d53390b5 notepad!WinMainCRTStartup+0x00000000000001c5
    00007ffa866c8102 KERNEL32!BaseThreadInitThunk+0x0000000000000022
    00007ffa8902c2e4 ntdll!RtlUserThreadStart+0x0000000000000034

如果您没有得到堆栈跟踪,可以尝试增加堆栈回溯数据库的大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接