2

为什么栈是可执行的?如果系统强制栈不可执行,文本不可写,代码注入攻击能完全停止吗?

4

3 回答 3

1

即使堆栈不可执行,也可以更改它......导致例程返回到不同的地址(因为返回地址通常存储在堆栈中)。

如果是可执行的,则可以写入数据以包含有效的操作码,并且可以操纵返回地址以返回该代码。

DEP(数据执行保护)和 NX(从不执行)等技术可以保护堆和堆栈不被执行。

于 2012-12-13T03:21:37.080 回答
0

可执行堆栈的主要历史原因是与一个鲜为人知且很少使用的 GCC 特性兼容,称为“嵌套函数”,它相当于具有自动存储持续时间的闭包。如果获取嵌套函数的地址,程序实际上必须生成一段代码,称为蹦床,以加载指向实际函数将使用的数据的隐藏参数。此代码位于堆栈上。

请注意,嵌套函数不是 C 语言的一部分,在 C 语言中没有理由让堆栈可执行。C 甚至不要求代码和数据位于公共地址空间中。因此,不旨在支持嵌套函数等非标准扩展的实现不应该提供可执行堆栈,因为它们加剧了程序可能存在的任何安全漏洞的危险。

于 2012-12-13T03:35:59.670 回答
0

为什么栈是可执行的?因为较旧的 x86 MMU(内存管理单元)每页只有 1 个访问位。值是读-执行或读-写-执行。具有 DEP 和 NX 的较新芯片在每页中添加了另一个位,以对执行权限进行细粒度控制。

于 2012-12-13T03:55:55.433 回答