如何调试赢32进程来查找内存访问冲突?
我在远程机器上安装了代理,此代理的行为类似于后台的进程,此进程通过端口号打开套接字连接。
问题:
这个代理被安全公司利用,我正在作为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> k
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
这将是如此善良才能得到专业的答案。 谢谢。
如果您有能力在目标机器上安装Visual Studio的远程调试组件,您可以按照此处所示执行此操作。
否则,请按照此处或此处所述的方法使用Windbg,具体取决于您可以在远程站点进行多少合作。
你有攻击的流量转储吗?
看起来你已经把EBP覆盖掉了,这可能会导致崩溃。 在大多数情况下,EBP并不像EIP那样重要,当函数返回时,它将EBP和EIP从堆栈中拉出来,它们彼此相邻。 它喜欢这是基于堆栈的溢出,因为这个EBP值。 虽然它可能是另一个错误,就像一个悬挂指针一样,但说实话,没有太多的信息要继续,我不得不在调试器中查看它。
如果你有源代码,那么使用Eclipse等内置的调试器或者Visual Studio。 如果你没有源代码,那么你可以使用OllyDBG或WinDBG,它可以让你感觉最舒服。 您应该重视该流程并再次触发崩溃。 这会向您显示造成此访问冲突的原始汇编程序。 您也可以在崩溃前设置一个断点以获取有效的堆栈跟踪。 由于堆栈跟踪已被覆盖,通常很难找到发生堆栈溢出的位置。
使用WinDBG / OllyDBG,您还可以在崩溃时检查内存,并了解如何影响程序。 您可能会损坏堆栈,并且EIP不受控制,因为该函数在返回之前崩溃。 有时,当你摧毁一个堆栈时,你必须知道一些有效的指针,以在程序返回之前满足读/写操作。
实际上并不是关于如何调试过程的答案 - 其他人已经回答了这个问题。 但作为补充信息,如果它可以帮助您:
看起来,在函数os_last_trim_trailing_space()
,您正在将用户控制的数据写入存储在堆栈中的char
缓冲区。 该char缓冲区的地址大约在堆栈底部以上270kb,因此它几乎肯定不会在该函数内分配 - 它可能是从调用函数传入的。
崩溃指令实际上是在执行buf[5018] = 'A'
,其中buf
远远小buf
值。 'A'
是用户控制的数据 - 长的As流(十六进制中的0x41
- 转储中的%dl
值)通常用于演示漏洞利用代码。
上一篇: How to debug win 32 process to find memory access violation?