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コマンドを使用して、認識できるものが見つかるまでコールスタックをパーコレーションしてバックアップできます。