GDBを使用して、32ビットx86プロセッサでデバッグシンボルを持たないプログラムをデバッグするにはどうすればよいですか?関数の引数、ローカル変数を調べ、ポインターを解決することは、その方法を知るのに役立ちます。これをリバースエンジニアリングに使用するつもりはありません。デバッグシンボルをインストールするのが面倒な場合があり、gdbから基本的な情報を取得する方法を知っておくとよいでしょう。
4 に答える
まず、次のことができます。
gdb "whatever"
break __libc_start_main
r
これにより、libc の crt0 コードにブレークポイントが設定され、ターゲット バイナリが完全に削除されていても、main の前でブレークできるようになります。
これにより、ほとんどのユーザー コードの前のブレークポイントで実行状態になります。その後、シングルステップ、逆アセンブル、メモリのダンプなどを心ゆくまで行うことができます。
これはすべてのプラットフォームで機能します。IA-32 / x86 についての質問は問題ではありません。
シンボルをデバッグしないと、ASMレベルでしかデバッグできません。わかりました。もう少し情報が得られますが、ASMとコンパイラーが生成するコードを少し理解しない限り、それほど遠くまでは行きません。これにより、自分が何をしているのかがわかっている場合は、ローカル変数などの簡単な検査を行うことができます。
ソースがある場合は、再コンパイルするだけではるかに簡単になります。
できることは、レジスタとスタックの内容を確認することだけです。Draemon が言及しているように、何に使用されているかを推測してすべてを行う必要があります。
まあ、絶対に最も重要なことは、スタックを巻き戻すことができるということです. これを保証するには、次の 3 つの方法があります。
でデバッグ シンボルをビルドします。
-g
テーブルを介して C++ 例外の巻き戻しを行うシステム (おそらく最近は ELF でしょうか?) では、
-funwind-tables
フラグは言語に関係なくそのようなテーブルを生成するように指示し、GDB はこれらのテーブルを使用できます (少なくとも、x86 Linux では使用できます)。または、それらに失敗した場合は、少なくとも
-fomit-frame-pointer
有効になっていないことを確認してください