malloc分配的内存保护标志是什么?
根据这个线程 , malloc
分配的malloc
至少有PROT_READ | PROT_EXEC
PROT_EXEC,否则无法执行包含的function。
man malloc
没有提及任何关于保护的问题。
malloc
不是为代码分配内存的正确工具。 您应该使用mmap
,并且根据系统上的偏执安全策略,您可能还需要使用mprotect
来更改权限。
malloc
不是正确的工具的原因之一:
- 权限仅使用页面粒度设置,但
malloc
获取的malloc
不太可能是页面对齐的,因此您最终也会设置相邻内存的权限,可能会破坏内容。 - 如果在调用
free
之前没有恢复旧权限,则可能会破坏malloc
的内部。
malloc()
通常会返回具有读写权限的内存。 某些体系结构(例如:较旧的x86)可能不允许以直接的方式禁用执行权限,但这只是平台的低效率。
如果要从分配的内存中执行代码,则必须明确授予执行权限,并且可能必须删除写入权限,因为在某些系统上对同一内存具有写入和执行权限被认为是有潜在危险的(通常称为W ^ X)。
从程序员分配的内存执行代码时还有其他几个线程:
在linux上的c中分配可执行文件ram
是否可以在标准C中执行堆栈中的代码?
在分配内存后,您可能需要调用mprotect
来自己设置mprotect
标志。
$ man mprotect