如何防止堆栈粉碎?

信息安全 攻击 开发 已知漏洞 缓冲区溢出
2021-08-19 04:17:09

我刚刚阅读了 AlephOne关于粉碎堆栈的论文,并在我的机器(Ubuntu 12.04)上实现了它,它有点旧,所以不得不从互联网上获得很多帮助,但我很喜欢它。

现在,我想了解在现实生活中如何防止这种情况发生。

如果您能向我推荐一些证明如何预防它的论文或在线资源,那就太好了。

2个回答

有两种主要技术可以缓解基于堆栈的缓冲区溢出。

第一种技术是从根本上解决问题。当程序试图写入数据结构的边界之外时,就会发生缓冲区溢出。阻止缓冲区溢出的最有效方法是阻止这种情况发生。使用一种编程语言,无论是 Java、Python 还是 Ruby,都会为您管理内存。如果必须使用 C,请确保在写入缓冲区之前执行正确的检查。

第二种技术涉及减轻缓冲区溢出可能造成的损害。堆栈金丝雀、DEPASLR等技术属于这一类。它们通过使攻击者更难在溢出后执行任意代码来限制缓冲区溢出可能造成的损害。这样的技术可以被打败。有关 DEP 和 ASLR 的更多信息,请参阅问题。

只是一个小提示:

由于您使用的是 Ubuntu 12.04 进行测试,因此您必须给您的系统一个命令(假设您从 Internet 获得了很多帮助,这是您第一次尝试破坏堆栈):

echo 0 > /proc/sys/kernel/randomize_va_space

或者一些相关的命令。该命令基本上禁用了系统上的ASLR(Terry 提到)。默认情况下,ASLR 是内核版本 2.6 及更高版本上启用的功能。

(实际上想将此作为评论发布,但由于声誉问题而无法这样做:))