web-dev-qa-db-ja.com

x86アセンブリの「呼び出し」命令の代わりになりますか?

X86呼び出し命令の代替手段は何ですか?たぶん、リターンアドレスのプッシュとジャンプのようなものですか?

また、メモリ内の現在の位置を取得するためのコマンドですか?

17
rick

たとえば、CALLは実際にこれを行います

CALL my_func

次のようなことをします

Push ret_address
jmp my_func

後続のRET呼び出しは、ある意味でJMPにプッシュしたばかりのアドレスを使用するだけです。 CALLを使用したくない特定の理由はありますか、それとも使用できませんか?メモリ内の現在の位置については、EIPレジスタの読み取りを試みることができます(書き込むことはできません)。

21
Jesus Ramos

Dword値とjmpをプロシージャにプッシュするだけです。プッシュはリターンアドレスになります:

Push return_address (Push eax if address in eax)
jmp call_address

その特定の呼び出しに引数が存在する場合は、引数をプッシュすることも忘れないでください。

メモリ内の現在の位置とはどういう意味ですか?あなたは現在の命令ポインタを意味していると思います。これを直接取得することはできませんが、sehハンドラー(構造化例外ハンドラー)を使用して、処理された例外が発生したときにその値を取得できます。

6
Spyros

何かが混同されないのなら、それは状況次第だと思います。ご覧のとおり ここ 近距離通話と遠距離通話がありますが、近距離通話について考えてみましょう。ここでも2つの可能性があります

E8 <offset> # relative
FF <address> # absolute

一方、FFは絶対的な「ジャンプ」を意味し、E8は確かに現在のeipに関連することを意味します。

だからあなたが例えば持っているなら.

E8 32 45 ab 6f

つまり、

call 0x3245ab6f

これは、

Push %eip
add $0x3245ab6f, %eip

ではなく

Push %eip
jmp $0x3245ab6f
2
whymatter