我正在阅读缓冲区,堆栈和堆溢出。我也读过这个post。我的问题是这样的:如果我在代码中只使用全局变量,我可以说它可以防止溢出的所有漏洞吗?
假设我在全局范围内声明的代码中有这个缓冲区:
char buf1[10];
char buf2[100];
如果我将buf1
作为缓冲区发送到recv(int s, char *buf, int len,int flags);
buf2
内容,对吧?我们能否得出结论,使用Globals是最安全的方式?
答案 0 :(得分:7)
不,一点也不。虽然更难直接修改堆栈上的返回地址等,但仍有可能破坏或恶意攻击此类程序(如果它不关心缓冲区溢出)。
答案 1 :(得分:3)
我可以说它可以阻止溢出的所有漏洞吗?
不,全局变量可能会溢出。
如果让我说我将它作为缓冲区发送到recv(int s,char * buf,int len,int flags);我将覆盖数据段并可能破坏buf2内容,但我无法从中运行代码。我对吗?使用Globals是最安全的方式吗?
不,变量的存储持续时间对它是否可以溢出没有影响。
答案 2 :(得分:3)
避免缓冲区溢出的最佳方法是避免使用静态缓冲区,并为需要记忆分配的任何对象使用lib,如STL,boost等,例如使用STL向量代替数组。
答案 3 :(得分:2)
存在缓冲区溢出漏洞,因为堆栈上的缓冲区与堆栈中的返回地址位于同一位置。最终该函数必须返回并使用该地址继续执行。通过故意覆盖缓冲区,可以存储不同的返回地址,可能是由开发者存放的代码。
当然,使用全局缓冲区可以降低此特定类型漏洞利用的可能性。但是,它不会因为在当前操作范围之外损坏数据而降低应用程序失败的可能性。
全球数据也有其缺点,并不是一个全面的解决方案。因此,最好的方法是防御性地设计代码,以便无论缓冲区位于何处都不会发生缓冲区溢出。
C和C ++都提供安全版本的缓冲区功能,这些功能应该与良好的设计一起使用,以防止安全漏洞。
答案 4 :(得分:2)
数据的位置无关紧要。如果你努力学习,你可以在外面写作。是否可以使用任何堆栈缓冲区溢出来覆盖返回地址并导致执行缓冲区中的代码,这取决于体系结构。恕我直言,堆栈段中的数据不应该是可执行的,并且尝试执行它应该导致内存管理中断。
除了琐碎的应用之外,使用'全局'而不是堆栈变量无论如何都不是一个理智的解决方案。
我只是将数据加载到缓冲区类中的dynamicaly-allocated缓冲区中,因此堆栈缓冲区溢出在我的应用程序中从未成为问题,(此外,我只是不会超出缓冲区!)。