1

前段时间我听说内存入侵,当软件 A 的某些部分进入同一软件 A 的另一部分时,导致程序无法正常工作。

内存入侵真的存在吗?我的意思是,我一直在使用 C++,而且我知道数组可以无限增长,但是它们可以其他结构上增长吗?如果数组不会生成 MI,那会是什么?

4

5 回答 5

5

您正在描述缓冲区溢出,是的,它们是软件安全问题的一大来源。如果有人可以用任意数据覆盖程序代码,并且该任意数据包含攻击者选择的可执行代码,那么他们基本上可以使用发生溢出的程序的特权级别执行机器代码。

当为未知数量的输入(来自键盘、网络、API 调用等)分配了固定数量的存储空间时,通常会发生此问题,并且输入量最终大于存储空间的大小。在不对数组访问执行边界检查的编程语言中,这可能会导致代码的可执行区域被覆盖。像DEP这样的技术可以通过写保护内存的可执行区域来降低这种风险。

于 2009-04-22T17:31:13.200 回答
2

堆栈溢出也可能导致此问题。

于 2009-04-22T17:35:07.027 回答
0

在不自动进行内存管理的语言中,这种情况并不少见。例如,缓冲区溢出就是入侵的一个很好的例子。

有一些针对特定类型入侵的保护措施(例如,您经常会遇到堆栈溢出而不是查看其他材料),但是任何时候涉及指针,都很容易查看您不期望的内存或代码使用权。

Java 和 C# 等语言不允许您在低级别操作内存,因此可以降低风险。

于 2009-04-22T17:33:02.180 回答
0

“内存入侵”称为缓冲区或堆栈溢出。它可能是您可以利用来查找安全漏洞的最重要的漏洞。

标准 C 库中充满了愉快地假设输入不会溢出分配的缓冲区空间的函数。当输入大于缓冲区时,缓冲区溢出到内存的其他部分。该程序不再正常工作,并且可能以微妙的方式损坏。

阅读:http ://www.owasp.org/index.php/A5_2004_Buffer_Overflow

于 2009-04-22T17:34:27.687 回答
0

在 C++ 中,数组不能无限增长。你没有无限的记忆。内存入侵将由以下原因引起:

int foo[100];
foo[100]=5; // writing outside the array. This might cause some problems.
于 2009-04-22T17:37:32.157 回答