21

バックストーリー:プログラムを実行しているときに、「/ dev/urandom」が編集straceされていることに気付きました。openこの呼び出しがどこから来ているのか知りたいです(プログラム自体の一部ではなく、システムの一部です)。

したがって、gdbを使用して、呼び出しが発行されcatch syscall openたときにプログラムの実行を中断(使用)しようとしているので、バックトレースを確認できます。open問題は、数百回のようにたくさんopen呼び出されているため、/ dev/urandomを開いている特定の呼び出しを絞り込むことができないことです。特定の通話を絞り込むにはどうすればよいですか?引数でフィルタリングする方法はありますか?もしそうなら、システムコールに対してどのようにそれを行うのですか?

どんなアドバイスも役に立ちます-多分私はこれについてすべて間違っていると思います。

4

3 に答える 3

14

GDBは非常に強力なツールですが、少し学習曲線があります。

基本的に、条件付きブレークポイントを設定する必要があります。

まず、-iフラグを使用してstraceまたはobjdump -dを実行し、開いている関数のアドレス、またはより現実的には、pltなどのそこに到達するチェーン内の何かを見つけます。

そのアドレスにブレークポイントを設定します(デバッグシンボルがある場合は、代わりに*を省略して使用できますが、そうではないと思います-ライブラリ関数用にブレークポイントを設定することもできます。

break * 0x080482c8 

次に、条件付きにする必要があります

(理想的には、文字列引数を目的の文字列と比較できます。試行してから最初の数分以内にこれが機能しませんでした)

文字列がプログラムのどこか、またはプログラムがロードするライブラリの1つで定数であると想定できることを期待しましょう。/ proc / pid / mapsを調べて、何がどこにロードされているかを確認し、grepを使用して文字列が実際にファイルにあることを確認し、objdump -sを使用してそのアドレスを検索し、gdbを使用してマップのアドレスの上位部分とファイルの下位部分を組み合わせることにより、実際にメモリ内でそれを見つけました。(編集:/ proc / pid / mapsを調べるよりも、実行可能ファイルでlddを使用する方がおそらく簡単です)

次に、作業しているプラ​​ットフォームのabiについて、具体的には引数がどのように渡されるかについて知る必要があります。私は最近armに取り組んでいますが、最初のいくつかの引数がレジスタr0、r1、r2などに含まれているので非常に便利です。x86は少し便利ではありません。 ($ esp + 4)、*($ esp + 8)、*($ esp + 12)。

したがって、x86を使用していると仮定し、esp + 4の最初の引数が、通過する定数をキャッチしようとしている定数に対して見つけたアドレスと等しいことを確認したいとします。唯一、esp+4はcharポインタへのポインタです。したがって、比較のために逆参照する必要があります。

cond 1 *(char **)($esp+4)==0x8048514

次に、 runと入力して、最高のものを期待できます

ブレークポイントの状態をキャッチし、情報レジスタとxコマンドを調べてメモリを調べるのが正しいと思われる場合は、returnコマンドを使用して、認識できるものが見つかるまでコールスタックをパーコレーションしてバックアップできます。

于 2011-05-03T03:54:41.020 に答える
5

(質問編集から適応)

クリスの答えに続いて、これが私が探していたものを最終的に私にもたらしたプロセスです:

open( 「/ dev / urandom」でsyscallを呼び出している関数を見つけようとしています)

  1. 実行可能ファイルでlddを使用して、ロードされたライブラリを検索します
  2. grep'urandom'を探している各lib(シェルコマンド)を介して
  3. 16進エディタでライブラリファイルを開き、文字列のアドレスを見つけます
  4. syscallsでパラメーターがどのように渡されるかを調べます(開く場合、ファイルは最初のパラメーターです。x86_64では渡されrdiます-マイレージは異なる場合があります
  5. これで、条件付きブレークポイントを設定できます。break open if $rdi == _addr_
  6. プログラムを実行し、休憩がヒットするのを待ちます
  7. btバックトレースを確認するために実行します

結局、glibのg_random_int()とg_rand_new()がurandomを使用していることがわかりました。Gtk+とORBitはこれらの関数を呼び出していました-誰かが興味を持っていれば。

于 2014-05-30T18:47:07.130 に答える
5

アンドレ・プエルが言ったように:

break open if strcmp($rdi,"/dev/urandom") == 0

仕事をするかもしれません。

于 2016-12-04T22:56:43.053 に答える