web-dev-qa-db-ja.com

このInteljmpq命令は何をしますか?

以下のIntel命令でアドレス_0x600860_はどのように計算されますか? _0x4003b8_ + _0x2004a2_ = _60085a_なので、計算がどのように実行されるかわかりません。

0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <[email protected]>

14
RouteMapper

Intelでは、JMP、CALLなどは、next命令のプログラムカウンタに関連しています。

あなたの場合の次の指示は0x4003be、および0x4003be + 0x2004a2 == 0x600860

23

これは、メモリ間接のAT&T構文です [〜#〜] jmp [〜#〜] RIP相対アドレッシングモードを使用します。

ジャンプアドレスは、命令ポインタに対して指定されたメモリ位置からフェッチされます。最初に_0x4003be + 0x2004a2 == 0x600860_を計算し、次に位置_0x600860_からジャンプするアドレスをフェッチします。

他のアドレッシングモードも可能です。たとえば、ジャンプテーブルで使用できます。
jmpq *(%rdi, %rax, 8)、RDIのテーブルベースとRAXのインデックス。

ただし、静的データのRIP相対アドレス指定は一般的です。この場合、動的リンクによって設定されたGOT(グローバルオフセットテーブル)のエントリをアドレス指定しています。

0
Konrad Eisele