2010-11-30 21 views
6

objdumpユーティリティを使用してアセンブリからコントロールフローグラフを作成しようとしていますが、問題が発生しています。基本的に、分岐が発生し、ターゲットアドレスが相対的な場合は、次の基本ブロックの開始位置を知る方法がわかりません。私が明確かどうか分からないので、例を追加します。私のプログラムがobjdumpの出力を通り、最初の基本ブロックの開始アドレスを記録しているとします。その後、相対アドレス指定を使用してジャンプする適切なアドレスを指すジャンプコマンドをヒットします。私は、最初の基本ブロックの終わりがすぐに起こることを知っていますが、次の基本ブロックの開始に正しいアドレスを取得するにはどうしたらいいですか?誰もが提供できる指針があれば、大いに感謝します。私はx86の初心者です。私は先週、これに対して頭を打っています。objdump使用時のレジスタ値の決定

答えて

4

私がこの質問を理解していると仮定すると、おそらくこれであなたが始まるでしょう。相対的なジャンプはpcベースです。

 
d: eb 04 jmp 13 

0xEBは、8ビットの即値に基づく相対ジャンプのオペコードです。命令のアドレスはobjdump出力にあり、この場合はdまたは0xDです。これは2バイト命令(x86は可変長)です。これは宛先アドレスが何であるかを出力に伝えます。この場合はjmp 13です。したがって、13で始まるコロンとobjdump出力の行を探しているのは、次のコードの塊です。

そのアドレスの計算方法を理解する。 PCは命令をフェッチし始めるときに0xDにあり、2バイトかかるので、この命令を実行する準備ができたら、0xD + 2 = 0xFになります。オフセットは0x4なので、宛先アドレスは0xF + 0x4 = 0x13です。

 
20: 75 ed jne f 

同じように後ろ向きです。 PCプラスバイト数= 0x20 + 2 = 0x22。 0xEDは符号付きの数値で負の値なので、0xEDを0xFFFFFFF ... FFFFEDに拡張しますが、アドレスレジスタは大きくなります。 0x22 + 0xFFFFFF ... FFFEDを追加すると、宛先アドレスが0x0Fになります。また、0xEDを使用して反転し、1を加算して無効にすることもできます。 〜0xED = 0x12、0x12 + 1 = 0x13。 0xEDは0x13を減算することを意味します。 0x22-0x13 = 0x0F。

ここでもう少し詳しく説明しますが、いずれの場合も、objdumpの出力で探し出すことのできるターゲットアドレスが与えられます。

この値の計算方法を理解する。同じ話ですが、0x400A81のオペコードで始まります。可変長命令の場合、この場合6バイト必要です。だから、あなたはPCを実行する準備が整うまでに0x400A81 + 6 = 0x400A87になります。オフセットは0x107です。したがって、条件が満たされた場合、宛先アドレスは0x400A87 + 0x107 = 0x400B8Eとなります。

これらは、逐次コードではなく、孤立した例の集まりであるより大きなプログラムからの抜粋です。

 
    400a81: 0f 8f 07 01 00 00  jg  400b8e 
    400a8f: 0f 8f e6 00 00 00  jg  400b7b 
    400a9d: 0f 8f c5 00 00 00  jg  400b68 
    400aab: 0f 8f a4 00 00 00  jg  400b55 
    400ab9: 0f 8f 83 00 00 00  jg  400b42 
    401d76: 0f 8f 31 01 00 00  jg  401ead 
+0

ありがとう、これは私の問題の多くをクリアします。基本的には、私が作業しているobjdumpの出力を完全に理解していないようです。誰でもobjdumpの出力についてもっと学ぶための良いリソースを知っていますか? – Sam

+0

私はいくつかの出力を読み返していますが、これはかなり明確です。私はまだこのような行について確信しています:4020a6:\t ff 25 4c 8f 21 00 jmpq * 0x218f4c(%rip)#61aff8 <_fini + 0x207840>基本的には、私は完全にobjdump出力を理解していないようです私は一緒に働いています。誰でもobjdumpの出力についてもっと学ぶための良いリソースを知っていますか? – Sam

+0

私はあなたが探しているものは、必ずしもobjdumpではないx86アセンブラを理解することです。その特定の命令のオペコードは私には飛び出ていませんが、シンタックスはレジスタベースのものであることを意味します。つまり、宛先アドレスは実行時に%ripの内容と関係があるテーブルは基本的にそして、このコードを実行するのではなく、それを調べるだけで、%ripの内容が何であるのかが分かりにくくなる可能性があります。その結果、宛先アドレスが何であるか把握できない場合があります。 –

関連する問題