2

我正在阅读有关缓冲区、堆栈和堆溢出的信息。我也读了这篇文章。我的问题是这样的:如果我在代码中只使用全局变量,我可以说它可以防止所有溢出漏洞吗?

假设我在全局范围内声明的代码中有这个缓冲区:

char buf1[10];
char buf2[100];

如果我buf1作为缓冲区发送到recv(int s, char *buf, int len,int flags);

  1. 我会覆盖数据段,可能会破坏buf2内容,对吗?
  2. 我是否能够从中运行代码,因为我知道它不是代码段并且数据段不可执行。

我们可以得出结论,使用 Globals 是最安全的方法吗?

4

5 回答 5

7

一点都不。虽然直接修改堆栈上的返回地址等更难,但仍然有可能破坏或恶意攻击这样的程序(如果它不注意缓冲区溢出)。

于 2012-04-09T17:03:51.337 回答
3

我可以说它可以防止所有溢出漏洞吗?

不,全局变量会溢出。

如果假设我将其作为缓冲区发送到 recv(int s, char *buf, int len,int flags); 我将覆盖数据段并可能破坏 buf2 内容,但我无法从中运行代码。我对吗?使用 Globals 是最安全的方法吗?

不,变量的存储时长对它是否可以溢出没有影响。

于 2012-04-09T17:04:32.443 回答
3

避免缓冲区溢出的最佳方法是避免使用静态缓冲区,并为任何需要内存分配的对象使用 STL、boost 等库,例如使用 STL 向量代替数组。

于 2012-04-09T17:08:55.117 回答
2

由于堆栈上的缓冲区与沿堆栈更远的返回地址位于同一位置,因此存在缓冲区溢出漏洞。最终,函数必须返回并使用该地址继续执行。通过故意覆盖缓冲区,可以存放一个不同的返回地址,也许是利用者存放的代码。

当然,使用全局缓冲区可以减少这种特定类型的漏洞利用的机会。但是,它不会降低由于当前操作范围之外的数据损坏而导致应用程序失败的可能性。

全球数据也有其缺点,它不是一个全面的解决方案。因此,最好的方法是防御性地设计您的代码,以便根本不会发生缓冲区溢出,无论缓冲区位于何处。

C 和 C++ 都提供安全版本的缓冲区函数,这些应该与良好的设计一起使用,作为防止安全漏洞的主要防护措施。

于 2012-04-09T17:09:30.917 回答
2

您的数据在哪里并不重要。如果你足够努力,你可以在外面写。是否可以使用任何堆栈缓冲区溢出来覆盖返回地址并导致缓冲区中的代码被执行,这取决于体系结构。恕我直言,堆栈段中的数据不应该是可执行的,并且尝试执行它应该会导致内存管理中断。

除了琐碎的应用程序之外,使用“全局变量”而不是堆栈变量无论如何都不是一个明智的解决方案。

我只将数据加载到缓冲区类中动态分配的缓冲区中,因此堆栈缓冲区溢出在我的应用程序中从来都不是问题,(此外,我只是不会溢出缓冲区!)。

于 2012-04-09T17:12:16.330 回答