基本上,我使用ptrace向远程进程注入shell代码以供执行。但我发现了一些关于RIP注册的奇怪行为。
我所做的就是将我的shell代码复制到程序映射的起始地址。然后,我将使用ptrace的RIP设置为起始地址所在的地址。然后继续执行代码的目标进程。一旦shell代码完成(通过运行int3),我将获得信号并恢复我刚刚修改的代码。
它可以正常工作,除非远程进程在系统调用(如sleep )中被阻塞。如果在附加进程时,远程进程在系统调用中被阻塞,则在将RIP设置为要执行shell代码的位置,然后继续目标进程之后,我将观察到RIP实际上比我在ptrace调用中输入的地址少2。例如,如果我将RIP设置为0x4000,一旦恢复RIP,RIP就变成0x3ffe。很明显,通常情况下,它会因为段故障而崩溃。但是,如果我在没有恢复进程的情况下设置了寄存器,那么RIP就是我刚刚设置的值。目前,我通过在shell代码前面插入2个nop指令来解决这个问题,并且在设置RIP时总是添加2。我只想知道,在设置RIP时,我是否错过了什么,或者我的整个注入代码的方法是完全不稳定的?
我的开发框是Ubuntu14.04,内核是3.13.0-45-泛型。
发布于 2016-06-24 09:14:13
如果我记得,如果您在syscall中阻塞进程时中断进程,则程序计数器值在继续时将由内核减去sizeof(syscall指令)。因此,一旦您执行了一个PTRACE_DETACH,该过程将重新执行被中断的syscall。
我克服这个问题的方式和你一样(总是添加一个微小的nop雪橇和递增的RIP)。
https://stackoverflow.com/questions/38006277
复制相似问题