为什么堆缓冲区溢出只会在某些 Windows 10 系统上导致崩溃?

信息安全 堆溢出
2021-09-02 02:22:24

我有一个stl::vector(VS 2010 SP1,x86)越界读取访问尝试,仅导致三个 Windows 10 系统崩溃。它可以在这些系统上完全重现,但不能在其他系统(Windows 10 或其他系统)上重现,使用完全相同的可执行文件和数据文件。

在检测违规的这三个系统上可以采取哪些安全保护措施,或者为什么其他系统上可能不会发生这种情况?

错误软件位于从 .NET(托管)可执行文件运行的 C++ 静态库中。

1个回答

正如有人已经指出的那样:不要期望未定义的行为是可重现的。

也就是说,有很多变数。当然有一些明显的(比如 CPU 架构/32 位或 64 位模式;操作系统的确切版本或涉及的其他软件(如 .NET);等等),但也有更微妙的。就像进程在一次请求一些内存时给予多少内存,甚至一次请求多少内存。

因此,如果您在崩溃之前检查进程在不同机器上拥有多少虚拟内存,并且数字不同,这可能是它在一个系统上崩溃而不在另一个系统上崩溃的一个很好的理由。

一次为进程分配多少内存取决于许多不同的因素,例如可用物理内存、可用交换空间、使用哪种交换策略、当前如何分配内存等。如果你在具有 16 GB 内存的机器上对其进行了 10 次测试,目前它使用 1 GB 内存用于操作系统和其他应用程序,并且进程没有崩溃,您并没有真正可靠地重现该行为。你保持变量相对恒定。它很可能在具有完全相同软件但只有 4 GB 内存并使用 3 GB 内存的机器上全部崩溃 10 次。