Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调试win32进程以发现内存访问冲突?_C++_C_Security_Debugging - Fatal编程技术网

C++ 如何调试win32进程以发现内存访问冲突?

C++ 如何调试win32进程以发现内存访问冲突?,c++,c,security,debugging,C++,C,Security,Debugging,我在远程机器上安装了代理,该代理的行为类似于后台的进程工作, 进程使用端口号打开套接字连接。 问题: 此代理被安全公司利用,我作为QA希望找到问题并修复它。 我有一个Perl脚本,它能够通过套接字连接连接到代理,并发送一些数据让代理:(db8.dc4):访问冲突-代码c0000005(first chance) 如何在使用脚本发送数据以查找此访问冲突消息时调试进程 可能要使用:windbg或免疫调试器 异常详细信息: (db8.dc4):访问冲突-代码c0000005(第一次机会) 在任何异常

我在远程机器上安装了代理,该代理的行为类似于后台的进程工作, 进程使用端口号打开套接字连接。
问题:
此代理被安全公司利用,我作为QA希望找到问题并修复它。
我有一个Perl脚本,它能够通过套接字连接连接到代理,并发送一些数据让代理:(db8.dc4):访问冲突-代码c0000005(first chance)

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

可能要使用:windbg或免疫调试器


异常详细信息:
(db8.dc4):访问冲突-代码c0000005(第一次机会)
在任何异常处理之前都会报告第一次机会异常。
此异常是可以预料和处理的。
eax=01554b40 ebx=00000000 ecx=01558c66 edx=014a0041 esi=0000139a
edi=015537a6
eip=0036cf14 esp=0145e44c ebp=FFFFFF iopl=0 nv向上ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00010206
莫西夫32!os_last_trim_training_space+0xb717:
0036cf14 88140e mov字节ptr[esi+ecx],dl
ds:0023:0155a000=??
0:002>k
ChildEBP-RetAddr
警告:堆栈展开信息不可用。以下帧可能是 错。
0145e450 005938b8 mosifs32!操作系统最后一次修剪尾随空间+0xb717
0145e468 00594106麦克汉!mchan_post_消息+0x2144a
000000000000000000麦克汉!mchan_post_消息+0x21c98


如果能得到专业的回答,那太好了。
谢谢。

您有攻击的流量转储吗

看起来您已将EBP覆盖为ffffffff,这可能会导致崩溃。在大多数情况下,控制EBP不如控制EIP重要,当函数返回时,它会将EBP和EIP从堆栈中拉出来,并且它们彼此相邻。由于这个EBP值,这很可能是一个基于堆栈的溢出。虽然它可能是另一个bug,就像一个,但老实说,没有太多的信息,我必须在调试器中查看它

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


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

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


否则,请按照所述或使用Windbg,具体取决于远程站点的合作程度。

实际上没有关于如何调试流程的答案-其他人已经回答了这个问题。但作为补充信息,如果它能帮助您:

似乎在函数
os\u last\u trim\u training\u space()
中,您正在将用户控制的数据写入存储在堆栈上的
char
缓冲区。该字符缓冲区的地址在堆栈底部上方约270kb,因此几乎可以肯定它没有在该函数中分配-它可能是从调用函数传入的


崩溃指令实际上执行的是
buf[5018]='A'
,其中
buf
比这个小得多<代码>'A'是用户控制的数据-As的长流(
0x41
十六进制格式-转储中
%dl
的值)通常用于演示利用代码。

这在优化的C/C++代码中很常见,ebp寄存器用作另一个通用寄存器/MSVC中的Oy选项。@Hans Passant很好,我不知道。就像我说的,它可能是一个悬空的指针,我们没有足够的信息。