使用SINGLESTEP通过ptrace获取返回值

时间:2012-05-10 23:21:08

标签: c linux ptrace

我正在使用Linux 64位下的一个小调试器,我在寻找系统调用的返回值时遇到了麻烦,

我正在测试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中,但我不知道如何见证返回用户空间。

谢谢你。

1 个答案:

答案 0 :(得分:2)

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

相关问题