根据this thread,malloc
分配的内存至少有PROT_READ | PROT_EXEC
,否则无法执行包含的函数。
man malloc
没有提及保护这一问题。
答案 0 :(得分:5)
malloc
不是为代码分配内存的正确工具。您应该使用mmap
,并且根据系统上的偏执安全策略,您可能还需要使用mprotect
来更改权限。
malloc
不是正确的工具的原因之一:
malloc
获取的内存不太可能是页面对齐的,因此您最终也会设置相邻内存的权限,可能会破坏内容。free
之前未恢复旧权限,则可能会破坏malloc
的内部。答案 1 :(得分:4)
malloc()
通常会返回具有读写权限的内存。某些体系结构(例如:较旧的x86)可能不允许以直接的方式禁用执行权限,但这只是平台的低效率。
如果要从分配的内存中执行代码,则必须明确授予执行权限,并且可能必须删除写入权限,因为在同一内存上同时具有写入和执行权限被认为是有潜在危险的在某些系统上(通常称为W ^ X)。
在程序员分配的内存中执行代码时还有其他几个线程:
Allocate executable ram in c on linux
Is it possible to execute code from the stack in standard C?
答案 2 :(得分:1)
在分配内存后,您可能需要自己调用mprotect
来设置PROT_EXEC
标志。