gpt4 book ai didi

linux - 为什么在 mmap 中 PROT_READ 等于 PROT_EXEC

转载 作者:可可西里 更新时间:2023-11-01 11:45:42 25 4
gpt4 key购买 nike

我尝试使用mmap 函数分配一些具有只读访问权限的内存页。我打印了 /proc/self/maps 来检查内存保护是否正常工作。即使 mmap 的保护参数是 PROT_READ

,它还是这样显示
 7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0

这意味着当我要求内核分配一些只读内存页时,它也将它们标记为可执行。

我做了一些其他测试,我意识到当我请求一个只写页面时,PROT_WRITE 没有PROT_READmaps 文件是这样的:

7fec0c585000-7fec0c785000 -w-p 00000000 00:00 0 

除了前面的例子,这意味着 PROT_READ 等同于 PROT_EXEC

使用 PROT_WRITE|PROT_READ 调用 mmap,也可以执行。

我想知道是否有办法映射一个只读的、不可执行的内存页;还是可读写且不可执行的?


运行测试的计算机信息:

  1. Linux Arch 4.1.6-1-ARCH #1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU/Linux

  2. 英特尔酷睿 i5-2310,x86_64

最佳答案

经过一些研究后,我意识到 Linux 只有在 ELF 程序头中包含 GNU_STACK 程序头时才会激活内存保护。内存保护是指使用处理器的 NX 位,因此内存页面可以标记为不可执行。

据我了解,GNU_STACK 程序头旨在告诉内核您需要堆栈的一些特定属性,其中一个属性是不可执行的堆栈。看来,如果您不明确要求不可执行的堆栈,则所有标记为可读的 ELF 部分也将是可执行的。并且所有使用 mmap 的内存映射都具有相同的行为。

可悲的是,没有足够的文档说明 GNU_STACK 的作用,并且 mmap 的文档没有指定它与 GNU_STACK 的连接以启用执行保护。

引用资料:

https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart

关于linux - 为什么在 mmap 中 PROT_READ 等于 PROT_EXEC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32730643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com