我想使用ptrace在运行进程的堆栈中写入一段二进制代码。 但是,这会导致分段故障(信号11)。在最近的Linux上执行进程堆栈中的代码
我可以确保%eip寄存器存储指向我想要在堆栈中执行的第一条指令的指针。我想有一些机制可以保护堆栈数据可执行。
那么,有没有人知道如何禁用这种保护堆栈。具体来说,我正在尝试Fedora 15.
非常感谢!
读完所有回复之后,我尝试了execstack,它确实使堆栈可执行代码成为可能。谢谢你们!
我想使用ptrace在运行进程的堆栈中写入一段二进制代码。 但是,这会导致分段故障(信号11)。在最近的Linux上执行进程堆栈中的代码
我可以确保%eip寄存器存储指向我想要在堆栈中执行的第一条指令的指针。我想有一些机制可以保护堆栈数据可执行。
那么,有没有人知道如何禁用这种保护堆栈。具体来说,我正在尝试Fedora 15.
非常感谢!
读完所有回复之后,我尝试了execstack,它确实使堆栈可执行代码成为可能。谢谢你们!
这可能是由于现代处理器上的NX bit。您可以使用execstack
禁用此程序。
http://advosys.ca/viewpoints/2009/07/disabling-the-nx-bit-for-specific-apps/
正确的诊断,但我不认为execstack可以在运行时做任何事情。 – Tobu
如前所述这是由于NX位。但这是可能的。我知道gcc确实使用它自己作为trampolines(这是一种解决方法,例如,使嵌套函数的函数指针)。我没有看过详细信息,但我会建议看看gcc代码。在源代码中搜索特定于体系结构的宏TARGET_ASM_TRAMPOLINE_TEMPLATE
,那么您应该看看它们是如何实现的。
编辑:该宏的快速谷歌,给了我提示:mprotect
是用来更改内存页面的权限。当你生成日期并执行它时也要小心 - 你可能除了刷新指令缓存之外。
您拥有ptrace权限。这是因为你是同一个用户,还是因为你是根?你的目标是什么架构? – Tobu