11

あるスタック フレームから別のスタック フレームにジャンプする「危険な」プログラムを C++ で作成しました。目標は、コール スタックの最下位レベルから呼び出し元にジャンプし、何かを実行してから再び下にジャンプし、その間のすべての呼び出しをスキップすることです。

これを行うには、スタック ベース アドレスを手動で変更し (設定%ebp)、ラベル アドレスにジャンプします。gcc と icc の両方で、スタックがまったく破損することなく、完全に機能します。これが働いた日は涼しい日でした。

今、同じプログラムを C で書き直しましたが、うまくいきません。具体的には、gcc v4.0.1 (Mac OS) では動作しません。新しいスタック フレーム (スタック ベース ポインターが正しく設定された状態) にジャンプすると、次の命令が実行され、fprintf. ここにリストされている最後の命令はクラッシュし、NULL を逆参照します。

lea    0x18b8(%ebx), %eax
mov    (%eax), %eax
mov    (%eax), %eax

私はいくつかのデバッグを行いました.%ebxスタックフレームを切り替えるときにレジスタを手動で設定することで(最初に関数を離れる前に観察した値を使用して)、バグを修正することがわかりました。このレジスタは、gcc の「位置に依存しないコード」を扱うと読みました。

位置独立コードとは何ですか? 位置に依存しないコードはどのように機能しますか? このレジスターは何を指していますか?

4

2 に答える 2