微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用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,它将执行系统调用并在返回后的下一条指令处停止.此时,您可以检查寄存器以查看系统调用的返回值.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐