为什么栈是可执行的?如果系统强制栈不可执行,文本不可写,代码注入攻击能完全停止吗?
问问题
245 次
3 回答
0
可执行堆栈的主要历史原因是与一个鲜为人知且很少使用的 GCC 特性兼容,称为“嵌套函数”,它相当于具有自动存储持续时间的闭包。如果获取嵌套函数的地址,程序实际上必须生成一段代码,称为蹦床,以加载指向实际函数将使用的数据的隐藏参数。此代码位于堆栈上。
请注意,嵌套函数不是 C 语言的一部分,在 C 语言中没有理由让堆栈可执行。C 甚至不要求代码和数据位于公共地址空间中。因此,不旨在支持嵌套函数等非标准扩展的实现不应该提供可执行堆栈,因为它们加剧了程序可能存在的任何安全漏洞的危险。
于 2012-12-13T03:35:59.670 回答
0
为什么栈是可执行的?因为较旧的 x86 MMU(内存管理单元)每页只有 1 个访问位。值是读-执行或读-写-执行。具有 DEP 和 NX 的较新芯片在每页中添加了另一个位,以对执行权限进行细粒度控制。
于 2012-12-13T03:55:55.433 回答