4

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

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

谢谢。

4

1 回答 1

3

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

于 2012-05-10T23:33:50.297 回答