2012-05-10 60 views
3

我的工作在Linux下64位一點點調試器,我有找的系統調用的返回值的麻煩ptrace的返回值,獲取使用單步

我測試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中,但我不知道如何目擊返回到userland。

謝謝你。

+0

rip是指令指針 - 它包含下一個要執行的指令的地址,而不是該指令的操作碼位... –

+0

我對RIP的位置做了一次PEEK,因此ptrace讓我回到操作碼編輯操作 – r3dalice

回答

1

你不能追蹤內核,所以如果你在SYSCALL停下來之後再做一次PTRACE_SINGLESTEP或PTRACE_SYSCALL,它將執行系統調用並在返回後的下一條指令處停止。此時,您可以檢查寄存器以查看系統調用的返回值。

+0

好吧,現在我明白了,我在PTRACE_GETREGS出現錯誤,修復並批准此答案,謝謝!編輯:有一個好地方wait4(2)它的作品非常感謝你! – r3dalice