我想使用ptrace在正在运行的进程的堆栈中编写一段二进制代码。 然而,这导致分段故障(信号11)。
我可以确保%eip寄存器存储指向我想在堆栈中执行的第一条指令的指针。我想有一些机制可以保护堆栈数据不可执行。
那么,有没有人知道如何禁用这种堆栈保护。具体来说,我正在尝试Fedora 15。
非常感谢!
阅读完所有回复之后,我尝试了execstack,它真正使堆栈中的代码可执行。谢谢大家!
答案 0 :(得分:5)
这可能是由于现代处理器上的NX bit。您可以使用execstack
为您的程序禁用此功能。
http://advosys.ca/viewpoints/2009/07/disabling-the-nx-bit-for-specific-apps/
答案 1 :(得分:2)
如前所述,这是由于NX位。但这是可能的。我确信gcc将它本身用于蹦床(这是一种解决方法,例如制作嵌套函数的函数指针)。我没看过细节,但我建议看一下gcc代码。在特定于体系结构的宏TARGET_ASM_TRAMPOLINE_TEMPLATE
的源代码中搜索,您应该看到它们是如何实现的。
mprotect
用于更改内存页面的权限。在生成日期并执行它时也要小心 - 除了刷新指令缓存之外,您还可以使用它。