2016-12-12 85 views
2

在安全领域,有堆挖掘和堆栈粉碎攻击。为什么堆栈或堆段中的代码可以执行?

但我发现/proc/*/maps文件,堆和堆栈段, 只有rw-p - 许可。

这两个段没有执行权限。 我的工程师朋友告诉我,如果您在Intel CPU中拥有rw权限,您的代码将自动获得执行权限。 但我不明白为什么英特尔做这个设计?

+0

曾经是真实的,但英特尔处理器已经有[NX位选项(https://开头en.wikipedia.org/wiki/NX_bit)。 –

+0

@HansPassant但只限于长模式(64位页表项)。 –

+0

你可能需要看看这个https://en.wikipedia.org/wiki/Executable_space_protection实际上,即使你跳转到堆栈或堆段,代码也不能执行。你会得到分段错误。这是因为你的段(堆栈或堆)没有执行权限,但你试图执行它。然后cpu抛出异常。 – bananaappletw

回答

2

这是因为Linux中的所有段(Windows也有)具有相同的基地址和相同的大小。代码总是通过代码段访问,代码段覆盖与堆栈(或任何其他)段完全相同的区域,因此您可以在任何地方执行代码。

编辑:

,你可以在这里阅读更多:http://www.intel.com/Assets/en_US/PDF/manual/253668.pdf 第3.2章使用区隔

+0

这是不正确的。 除了使用参数'-z execstack'编译代码,否则程序是NX保护的。 – bananaappletw

+0

这里是一个简单的工具来检查你的段是NX保护.http://www.trapkit.de/tools/checksec.html – bananaappletw

+0

@bananaappletw:32位模式不支持NXE保护(这是在文档中提到的我已经给出)。但是,是的,在64位(IA-32e)模式下,可以使用它,但只能在分页级(不是段级)。 –