C 为什么可以执行堆栈或堆段中的代码?
在安全领域,存在堆攻击和堆栈破坏攻击 但是我发现C 为什么可以执行堆栈或堆段中的代码?,c,security,buffer-overflow,C,Security,Buffer Overflow,在安全领域,存在堆攻击和堆栈破坏攻击 但是我发现/proc/*/maps文件,堆和堆栈段, 只有rw-p-权限 在这两个段中没有执行权限。 我的工程师朋友告诉我,如果您在英特尔CPU中拥有rw权限,您的代码将自动获得执行权限。 但我不明白英特尔为什么要做这种设计?这是因为Linux(Windows)中的所有段都具有相同的基址和大小。代码总是通过代码段访问,代码段覆盖的区域与堆栈(或任何其他)段完全相同,所以您可以在任何地方执行代码 编辑: 您可以在此处阅读更多内容: 第3.2章使用段这过去是正确
/proc/*/maps
文件,堆和堆栈段,
只有rw-p
-权限
在这两个段中没有执行权限。
我的工程师朋友告诉我,如果您在英特尔CPU中拥有rw
权限,您的代码将自动获得执行权限。
但我不明白英特尔为什么要做这种设计?这是因为Linux(Windows)中的所有段都具有相同的基址和大小。代码总是通过代码段访问,代码段覆盖的区域与堆栈(或任何其他)段完全相同,所以您可以在任何地方执行代码 编辑: 您可以在此处阅读更多内容:
第3.2章使用段这过去是正确的,但英特尔处理器在过去十年中一直采用这种方法。@HansPassant,但仅在长模式(64位页表项)下使用。您可能需要了解一下这一点。实际上,堆栈或堆段中的代码即使跳转到该模式也无法执行。你会犯错误的。这是因为您的段(堆栈或堆)没有执行权限,但您尝试执行它。然后cpu抛出异常。这是不正确的。除非您使用参数
-z execstack
编译代码,否则程序受NX保护。这里有一个简单的工具来检查您的段是否受NX保护。@bananaappletw:32位模式不支持NXE保护(在我给出的文档中提到)。但是,是的,在64位(IA-32e)模式下可以使用它,但只能在分页级别(而不是段级别)使用它。我不知道你们在说什么。你的后一个答复是正确的。但是你的答案是错误的。就像这行:您可以在任何地方执行代码。如果它像你说的那样运行,那么NX保护有什么用呢。@bananaappletw:我使用了你可以在任何地方执行代码,只要它是表达式,就可以按段执行。NX保护不是分段保护的一部分,不适用于每个x86 cpu。