Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么可以执行堆栈或堆段中的代码?_C_Security_Buffer Overflow - Fatal编程技术网

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。