在最近的Linux上执行进程堆栈中的代码

时间:2011-06-26 07:42:16

标签: linux stack

我想使用ptrace在正在运行的进程的堆栈中编写一段二进制代码。 然而,这导致分段故障(信号11)。

我可以确保%eip寄存器存储指向我想在堆栈中执行的第一条指令的指针。我想有一些机制可以保护堆栈数据不可执行。

那么,有没有人知道如何禁用这种堆栈保护。具体来说,我正在尝试Fedora 15。

非常感谢!


阅读完所有回复之后,我尝试了execstack,它真正使堆栈中的代码可执行。谢谢大家!

2 个答案:

答案 0 :(得分:5)

这可能是由于现代处理器上的NX bit。您可以使用execstack为您的程序禁用此功能。

http://advosys.ca/viewpoints/2009/07/disabling-the-nx-bit-for-specific-apps/

http://linux.die.net/man/8/execstack

答案 1 :(得分:2)

如前所述,这是由于NX位。但这是可能的。我确信gcc将它本身用于蹦床(这是一种解决方法,例如制作嵌套函数的函数指针)。我没看过细节,但我建议看一下gcc代码。在特定于体系结构的宏TARGET_ASM_TRAMPOLINE_TEMPLATE的源代码中搜索,您应该看到它们是如何实现的。

编辑:这个宏的快速谷歌,给了我提示:mprotect用于更改内存页面的权限。在生成日期并执行它时也要小心 - 除了刷新指令缓存之外,您还可以使用它。

相关问题