gpt4 book ai didi

linux - 使用 ptrace 设置 RIP 的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:22 24 4
gpt4 key购买 nike

基本上,我使用 ptrace 将 shell 代码注入(inject)远程进程以供执行。但是我发现了一些关于 RIP 寄存器的奇怪行为。

我所做的是将我的 shell 代码复制到程序映射的起始地址。然后我使用 ptrace 将 RIP 设置为起始地址所在的地址。然后我恢复执行代码的目标进程。一旦 shell 代码完成(通过运行 int3),我将收到信号并恢复我刚刚修改的代码。

它工作正常,除非远程进程在 sleep 等系统调用中被阻塞。如果在我附加进程时远程进程在系统调用中被阻塞,在我将 RIP 设置到我想要执行 shell 代码的位置然后恢复目标进程后,我会观察到 RIP 实际上少了 2比我在 ptrace 调用中输入的地址还要多。例如,如果我将 RIP 设置为 0x4000,一旦我恢复它,RIP 将变为 0x3ffe。显然,由于段错误,我的情况通常会崩溃。但是如果我在设置后立即抓取寄存器而不恢复进程,那么 RIP 就是我刚刚设置的值。目前我通过在我的 shell 代码之前插入 2 个 nop 指令来解决这个问题,并且在我设置 RIP 时总是添加 2 个。我只想知道我在设置 RIP 时是否遗漏了什么,或者我的整个注入(inject)代码方法是否完全不稳定?

我的开发箱是 Ubuntu14.04,内核是 3.13.0-45-generic。

最佳答案

如果我没记错的话,如果您在进程被系统调用阻塞时中断进程,程序计数器值在继续时将被内核减去 sizeof(系统调用指令)。因此,一旦您执行了 PTRACE_DETACH,该进程将重新执行它被中断的系统调用。

我用和你一样的方法解决了这个问题(总是添加一个小的 nop-sled 和递增的 RIP)。

关于linux - 使用 ptrace 设置 RIP 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38006277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com