4

Linux 64ビットで小さなデバッガーに取り組んでいますが、システムコールの戻り値を探すのに苦労しています.

RIP 値をテストしています。つまり、PEEK_USERDATA を実行して ptrace を実行すると、RIP アドレスではなくオペコードが直接返されます (ここで、0x050f は SYSCALL のオペコードです)。

if (rip & 0x0000ffff == 0x050f)

次に、システムコール名の引数などを取得します

問題は、これらのシステムコールの戻り値をどのように取得するかです。ptrace が PTRACE_SYSCALL を提供して、カーネルモードの開始/終了について警告することは知っていますが、RIP 値を直接確認したいので、SINGLESTEP を使用しています。私のリップが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 に答える