如何调试win 32进程以查找内存访问冲突?

时间:2010-10-06 17:18:26

标签: c++ c security debugging

我在远程计算机上安装了代理程序,此代理程序的行为类似于后台进程, 进程打开与端口号的套接字连接 问题:
这个代理被安全公司利用,我作为QA想找到解决它的问题 我有Perl脚本能够通过套接字连接连接到代理并发送一些数据让代理为:(db8.dc4):访问冲突 - 代码c0000005(第一次机会)。

如何在使用脚本发送数据时调试进程以查找访问冲突的此消息。

也许可以使用:windbg或Immunity Debugger?


例外情况:
(db8.dc4):访问冲突 - 代码c0000005(第一次机会)
在任何异常处理之前报告第一次机会异常 可以预期和处理此例外情况 eax = 01554b40 ebx = 00000000 ecx = 01558c66 edx = 014a0041 esi = 0000139a
EDI = 015537a6
eip = 0036cf14 esp = 0145e44c ebp = ffffffff iopl = 0 nv up ei pl nz na pe nc
cs = 001b ss = 0023 ds = 0023 es = 0023 fs = 003b gs = 0000
EFL = 00010206
!mosifs32 os_last_trim_trailing_space + 0xb717:
0036cf14 88140e mov byte ptr [esi + ecx],dl
DS:0023:0155a000 =&
0:002> ķ
ChildEBP RetAddr
警告:堆栈展开信息不可用。以下帧可能是 错了。
0145e450 005938b8 mosifs32!os_last_trim_trailing_space + 0xb717
0145e468 00594106 mchan!mchan_post_message + 0x2144a
00000000 00000000 mchan!mchan_post_message + 0x21c98


获得专业答案真是太好了。 感谢。

3 个答案:

答案 0 :(得分:1)

你有攻击的流量转储吗?

看起来你已经将EBP覆盖为ffffffff,这可能会导致崩溃。在大多数情况下,EBP并不像EIP那样重要,当函数返回时,它会从堆栈中拉出EBP和EIP,并且它们彼此相邻。由于这个EBP值,这可能是基于堆栈的溢出。虽然它可能像Dangling Pointer一样是另一个错误,但说实话,没有太多信息可以继续,我必须在调试器中查看它。

如果您有源代码,则使用IDE内置的调试器,如Eclipse或Visual Studio。如果您没有源代码,那么您可以使用OllyDBG或WinDBG,无论您感觉最舒服。您应该附加到进程并再次触发崩溃。这将显示导致此访问冲突的原始汇编程序。您还可以在崩溃之前设置断点以获得有效的堆栈跟踪。由于堆栈跟踪已被覆盖,通常很难找到堆栈溢出的位置。

使用WinDBG / OllyDBG,您还可以在崩溃时检查内存,并了解如何影响程序。您可能损坏了堆栈并且EIP未受控制,因为该函数在返回之前崩溃。有时当你smash a stack时,你必须知道一些有效的指针,以便在程序返回之前满足读/写操作。

答案 1 :(得分:1)

如果您能够在目标计算机上安装Visual Studio的远程调试组件,则可以执行此操作,如here所示。

否则请按照herehere所述使用Windbg,具体取决于您可以在远程站点进行多少合作。

答案 2 :(得分:0)

实际上并不是关于如何调试过程的答案 - 其他人已经回答了这个问题。但作为补充信息,万一它可以帮助你:

似乎在函数os_last_trim_trailing_space()中,您正在将用户控制的数据写入存储在堆栈中的char缓冲区中。该char缓冲区的地址大约在堆栈底部270kb左右,所以它几乎肯定没有在该函数中分配 - 它可能是从调用函数传入的。

崩溃说明实际上是buf[5018] = 'A',其中buf比这小得多。 'A'是用户控制的数据 - 长的As(十六进制为0x41 - 转储中的%dl的值)通常用于演示漏洞利用代码。