设置可执行堆

设置可执行堆

execstack程序可用于将 ELF 二进制文件标记为需要可执行堆栈。

是否有类似的方法将堆标记为可执行文件?最好是单个二进制文件,但如果不可能,系统范围的解决方案也很有用。

答案1

设置可执行堆栈(或设置不可执行堆栈)对我尝试过的任何 Linux 版本都没有影响(x86_64 上的 2.6.9、x86_64 上的 2.4.21、2.6.20.9 x86、3.1.4 x86)。我目前无法访问 Solaris 或 *BSD 计算机。我猜测有问题的内核没有被编译为禁止“在堆栈上”执行代码。看到这个维基百科文章,这表示补丁或编译选项是必要的。

我已经写了在 malloc 内存中运行的 C 程序。它适用于我上面提到的所有相同的内核和架构。我怀疑您会找到像 execstack 这样的特定工具来将可执行文件标记为“堆可执行文件”。我能告诉你的最好的消息就是你必须使用mprotect()系统调用。即使使用,mprotect()我认为您也会发现一些更不寻常的架构(旧的 DEC Alpha 或 HP 的“精确架构”)永远不允许在堆外执行。

答案2

是的,正如 Ediger 指出的那样,您应该使用mprotect()系统调用。

但是,为了使用mprotect()系统调用,您需要找出您的内存地址位于哪个页面。也许口罩号码可以提供帮助。

这是一个非常简单的例子:

int *ptr = malloc(0x1000);
mprotect((long long)ptr & 0xfffffffffffff000, 0x1000, PROT_EXEC | PROT_READ | PROT_WRITE);
ptr[0] = 0xd503201f; // nop
ptr[1] = 0xd503201f; // nop
ptr[2] = 0xd503201f; // nop
ptr[3] = 0xd65f03c0; // ret
void (*foo)(void) = (void (*)())ptr;
foo();

相关内容