サイトでこれに関する関連記事をいくつか見つけましたが、どれも私の問題を説明していません。コードはここで説明されています: リンク
私の問題は次のとおりです。
著者は、ノートサーチ.c プログラムの strcpy() 関数の戻りアドレスをバッファー内のアドレスで書き換えて、シェルコード (メモリに埋め込まれたマシン コードであると理解しています) が実行されるようにしようとしています。
それが機能するために、彼は次のようなバッファを作成します: nop nop nop ... | シェルコード.. | 差出人住所
strcpy() 関数の呼び出し後に私が理解したことから、バッファはスタックに置かれ、戻り値を notesearch.c のメインに上書きします。strcpy() の実行が終了し、メインに戻りたいときに、バッファから戻り値を呼び出します。
私が理解していないのは、次のとおりです。
挿入されたリターンアドレスは常に元のアドレスと完全に一致しているように思えます。それはどうしてですか?
挿入された戻りアドレスは、同じバッファ内のシェルコードを指している、と本の中で述べています。シェルコードをメモリの別の部分ではなく、同じバッファに配置する必要があるのはなぜですか? それは無限ループを引き起こすことができませんでしたか?
リターン アドレスをバッファのシェルコードのアドレスに設定できないのはなぜですか? それとも、その問題の変数シェルコードに?
リターンアドレスがどのように計算され、なぜオフセットが必要なのか、誰でも詳しく説明できますか?