2012-05-10 6 views
3

を使用してのptraceで私は私が私が意味する、RIPの値をテストしています、私は、Linuxの64-ビットの下で少しデバッガに取り組んでいると私は、システムコールの戻り値を探してトラブルを抱えているSINGLESTEP

を戻り値を取得します。問題は、私はどのようにあるなどシステムコール名の引数を取得し、その後

if (rip & 0x0000ffff == 0x050f) 

:PEEK_USERDATAとptraceのは、お返しに私にノーRIPアドレス、直接このように(0x050fがSYSCALLのオペコードです)オペコードを与えますこれらのシステムコールの戻り値を取得し、私はptraceがPTRACEを提供することを知っています私はSINGLESTEPを使用しているので、自分のリップがSYSLEAVEとSYSEXITのオペコードと一致するかどうかをチェックしましたが、決してそれは決してありませんでした。戻り値を確認できる唯一の方法は、実際には私のorig_raxをチェックすることですが、この方法でexit_group retvalを取得することはありません。

私は、Linux ABIが戻り値をRAXに格納したいと思っていますが、私はuserlandへの復帰を目撃する方法はありません。

ありがとう。

+0

リッピングは命令ポインタです - 命令のオペコードビットではなく、実行する次の命令のアドレスが含まれています... –

+0

RIPの位置にPEEKを行います。 – r3dalice

答えて

1

カーネルをptraceすることはできません。したがって、SYSCALLで停止した後に別のPTRACE_SINGLESTEPまたはPTRACE_SYSCALLを実行すると、システムコールが実行され、戻った後で次の命令で停止します。その時点で、レジスタを調べて、システムコールの戻り値が何であるかを調べることができます。

+0

今、私はそれを得る、私はPTRACE_GETREGSでエラーが発生していることを修正し、この答えを承認してくれてありがとう!編集:良い場所でwait4(2)それは動作します非常にありがとう! – r3dalice

関連する問題