【问题标题】:Get the return value with ptrace using SINGLESTEP使用 SINGLESTEP 通过 ptrace 获取返回值
【发布时间】:2012-05-10 23:21:07
【问题描述】:

我正在开发 64 位 Linux 下的小调试器,但在查找 syscall 的返回值时遇到了麻烦,

我正在测试 RIP 值,我的意思是我做一个 PEEK_USERDATA 和 ptrace 给我操作码以返回没有 RIP 地址,直接这样(其中 0x050f 是 SYSCALL 的操作码):

if (rip & 0x0000ffff == 0x050f)

然后获取系统调用名称参数等

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

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

谢谢。

【问题讨论】:

  • rip 是指令指针——它包含要执行的下一条指令的地址,而不是该指令的操作码位...
  • 我对 RIP 的位置进行了 PEEK,所以 ptrace 将操作码编辑操作返回给我

标签: c linux ptrace


【解决方案1】:

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

【讨论】:

  • 好的,现在我明白了,我在使用 PTRACE_GETREGS 时遇到了一个错误,正在修复它并批准这个答案,谢谢!编辑:有一个好地方 wait4(2) 非常感谢你!!
猜你喜欢
  • 2012-12-18
  • 2023-04-02
  • 1970-01-01
  • 2014-07-04
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多