如何检测哪个 variable/code 正在创建基于堆栈的缓冲区溢出

How to detect which variable/code is creating a stack-based buffer overrun

我有一个应用程序开始失败 0xc0000409 - The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.

我有完整的故障转储和源代码,但这导致我在 Windows API 中找到 terminate()abort() 函数,但我看不到通过调用堆栈的任何特定于应用程序的代码。

用户表示他们在启动应用程序时出现内存不足错误 UI(它可以在命令行上 运行 或启动 UI)。

我的问题是,上述异常是否表明应用程序正在尝试将过多的数据加载到堆栈中,如果确实如此,是否有任何方法可以检测哪个变量,最好是哪一行代码导致堆栈缓冲区溢出运行 发生?我正在使用 WinDbg 和 Visual Studio.

分析转储文件

堆栈在下面。

WARNING: Stack unwind information not available. Following frames may be wrong.
00 0019d2f8 00868f91 MyApp+0x4ccf73
01 0019d308 7490e9a2 MyApp+0x468f91
02 0019d39c 7709d30e KERNELBASE!UnhandledExceptionFilter+0x172
03 0019ffdc 77061b34 ntdll!__RtlUserThreadStart+0x3b7d4
04 0019ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
  1. 为您的应用程序激活 Application Verifier。它有助于找到更接近实际根本原因的问题。
  2. 然后 运行 使用调试器。
  3. 使用大 CounterString (16 MB or so; funny generators here) 并将其粘贴到您拥有的每个文本框中。这可能会溢出您应用程序中所有未受保护的缓冲区。
  4. 等待应用程序抛出异常。它可能不是您看到的确切异常,因为应用程序验证程序可能引入了他自己的异常。
  5. 分析异常并留意Application Verifier给出的提示。它可能会为您提供有用的附加信息,这些信息仅在您激活应用程序验证器后可用。
  6. 如果需要,使用 CounterString 并在内存中找到它(在您的情况下可能在堆栈中)