使用SINGLESTEP通过ptrace获取返回值

我正在使用
Linux 64位下的一个小调试器,我在查找syscall的返回值时遇到问题,

我正在测试RIP值,我的意思是我做了一个PEEK_USERDATA并且ptrace给我操作码而不是RIP地址,直接这样(其中0x050f是SYSCALL的操作码):

if (rip & 0x0000ffff == 0x050f)

然后得到系统调用名称args等

问题是如何获得这些系统调用的返回值,我知道ptrace提供PTRACE_SYSCALL来警告我们关于进入/退出内核模式但是我想直接检查RIP值,所以我使用的是SINGLESTEP,我查了一下如果我的rip与SYSLEAVE和SYSEXIT操作码匹配,但它永远不会.我可以检查返回值的唯一方法是检查我的orig_rax,但是我不会以这种方式获得exit_group retval.

我知道Linux ABI希望将返回值存储在RAX中,但我不知道如何见证返回用户空间.

谢谢.

最佳答案 你不能ptrace内核,所以如果你在SYSCALL停止后再做一个PTRACE_SINGLESTEP或PTRACE_SYSCALL,它将执行系统调用并在返回后的下一条指令处停止.此时,您可以检查寄存器以查看系统调用的返回值.

点赞