【发布时间】: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 将操作码编辑操作返回给我