【发布时间】:2016-06-24 05:39:25
【问题描述】:
基本上我使用ptrace 将shell 代码注入远程进程以执行。但是我发现了一些关于 RIP 注册的奇怪行为。
我所做的是将我的 shell 代码复制到程序映射的起始地址。然后我使用 ptrace 将 RIP 设置为起始地址所在的地址。然后我恢复执行代码的目标进程。一旦 shell 代码完成(通过运行int3),我将收到信号并恢复我刚刚修改的代码。
它工作正常,除非远程进程在sleep 这样的系统调用中阻塞。如果远程进程在我附加进程时在系统调用中被阻塞,在我将 RIP 设置为我想要执行我的 shell 代码的位置然后恢复目标进程后,我会观察到 RIP 实际上少了 2比我在 ptrace 调用中输入的地址。例如,如果我将 RIP 设置为 0x4000,一旦我恢复它,RIP 就会变为 0x3ffe。显然,由于段故障,我的情况通常会崩溃。但是,如果我在设置后立即获取寄存器而不恢复进程,那么 RIP 就是我刚刚设置的值。目前我通过在我的 shell 代码之前插入 2 个 nop 指令来解决它,并且在我设置 RIP 时总是添加 2。我只是想知道设置 RIP 时有什么遗漏,或者我的整个注入代码的方法完全不稳定?
我的开发盒是 Ubuntu14.04,内核是 3.13.0-45-generic。
【问题讨论】: