我在远程计算机上安装了代理程序,此代理程序的行为类似于后台进程,
进程打开与端口号的套接字连接
问题:
这个代理被安全公司利用,我作为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
答案 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)
答案 2 :(得分:0)
实际上并不是关于如何调试过程的答案 - 其他人已经回答了这个问题。但作为补充信息,万一它可以帮助你:
似乎在函数os_last_trim_trailing_space()
中,您正在将用户控制的数据写入存储在堆栈中的char
缓冲区中。该char缓冲区的地址大约在堆栈底部270kb左右,所以它几乎肯定没有在该函数中分配 - 它可能是从调用函数传入的。
崩溃说明实际上是buf[5018] = 'A'
,其中buf
比这小得多。 'A'
是用户控制的数据 - 长的As(十六进制为0x41
- 转储中的%dl
的值)通常用于演示漏洞利用代码。