加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用SINGLESTEP通过ptrace获取返回值

发布时间:2020-12-16 07:30:34 所属栏目:百科 来源:网络整理
导读:我正在使用 Linux 64位下的一个小调试器,我在查找syscall的返回值时遇到问题, 我正在测试RIP值,我的意思是我做了一个PEEK_USERDATA并且ptrace给我操作码而不是RIP地址,直接这样(其中0x050f是SYSCALL的操作码): if (rip 0x0000ffff == 0x050f) 然后得到系统
我正在使用 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,它将执行系统调用并在返回后的下一条指令处停止.此时,您可以检查寄存器以查看系统调用的返回值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读