C语言 需要可执行堆栈和堆内存



众所周知,使虚拟内存的堆栈和堆区域不可执行可以防止在内存内执行恶意代码(如shellcode)(该技术称为数据执行保护)。而且,将恶意代码注入内存的最简单方法是溢出缓冲区。因此,使内存的这些区域不可执行有助于降低溢出攻击的严重性。

但是,还有许多其他技术,如地址空间随机化、指针保护、使用金丝雀等,用于防止此类攻击。我认为大多数系统都使用这些其他方法,而不是使堆栈/堆内存不可执行。(如果我在这里错了,请纠正我)

现在,我的问题是,是否有一些特定的操作或特殊情况需要内存的堆栈/堆部分才能执行?

JIT 映射内存的可写和可执行区域,或者只是mprotect以前分配的内存以使其可执行。

GCC 过去需要一个依赖于系统的方法来标记堆栈可执行文件的各个部分以获取其蹦床代码。这是12年前的事了,我不知道今天是怎么做到的。

许多系统上的动态链接还需要能够写入跳转表,以便在运行时解析函数调用。如果您希望在表更新之间使跳转表不可写入,则成本可能很高。

通常,可以通过尝试强制实施内存可写或可执行的策略来安全地解决这些问题,但绝不能同时执行两者。当需要完成写入时,可以将内存重新映射为可写,然后再次保护以使其可执行。它牺牲了一些性能(不是那么多)以获得更好的安全性和稍微复杂的代码。

最新更新