为什么堆栈可执行?如果系统强制堆栈不可执行且文本不可写,代码注入攻击是否可以完全停止?
答案 0 :(得分:1)
即使堆栈不可执行,也可以更改...导致例程返回到不同的地址(因为返回地址通常存储在堆栈中)。
如果堆是可执行的,则可以写入 data 以包含有效的操作码,并且可以操纵返回地址以返回该代码。
DEP(Data Execution Prevention)和NX(Never Execute)等技术可以保护堆和堆栈不被执行。
答案 1 :(得分:0)
可执行堆栈的主要历史原因是与一个鲜为人知且很少使用的称为“嵌套函数”的GCC功能的兼容性,这些功能相当于具有自动存储持续时间的闭包。如果你获取嵌套函数的地址,程序必须实际生成一段代码,称为trampoline,以加载一个隐藏的参数,指向实际函数将使用的数据。这段代码就在堆栈上。
请注意,嵌套函数不是C语言的一部分,并且C语言中没有理由使堆栈可执行。 C甚至不要求代码和数据位于公共地址空间中。因此,不旨在支持非标准扩展(如嵌套函数)的实现不应提供可执行堆栈,因为它们会增加程序可能存在的任何安全漏洞的危险。
答案 2 :(得分:0)
为什么堆栈可执行?因为较旧的x86 MMU(内存管理单元)每页只有1个访问位。值是读 - 执行或读 - 写 - 执行。带有DEP和NX的新芯片每页增加了一点,以便对执行权限进行细粒度控制。