【问题标题】:Execute code in process's stack, on recent Linux在最近的 Linux 上执行进程堆栈中的代码
【发布时间】:2011-09-22 21:21:19
【问题描述】:

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

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

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

非常感谢!


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

【问题讨论】:

  • 您拥有 ptrace 权限。这是因为您是同一个用户,还是因为您是root?您的目标是什么架构?

标签: linux stack


【解决方案1】:

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

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

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

【讨论】:

  • 正确诊断,但我不认为 execstack 在运行时可以做任何事情。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多