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

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

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

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

非常感谢!


读完所有回复之后,我尝试了execstack,它确实使得堆栈可执行代码成为可能。 谢谢你们!

这可能是由于现代处理器上的NX位 。 您可能能够使用execstack禁用您的程序。

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

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

如前所述,这是由于NX位。 但是这是可能的。 我知道gcc确实使用它自己的蹦床(这是一个解决方法,使例如嵌套函数的函数指针)。 我没有看过详细信息,但我会建议看看海湾合作委员会的代码。 搜索架构特定的宏TARGET_ASM_TRAMPOLINE_TEMPLATE的来源,你应该看看他们是如何做到的。

编辑:该宏的快速谷歌,给了我提示: mprotect是用来更改内存页面的权限。 生成日期并执行时也要小心,除了刷新指令缓存外,