典型的なスタック ベースのバッファ オーバーフロー攻撃のペイロードが次のようなものであることを理解しています。
(リターンアドレス) (リターンアドレス) ... (リターンアドレス) (リターンアドレス) (リターンアドレス) (リターンアドレス) (NOP) (NOP) (NOP) (NOP) ... (NOP) (NOP) (NOP) ) (NOP) (シェルコード)
また、シェルコードの実行が成功するかどうかは、次のいくつかの要因に依存することも理解しています。
- ペイロードの繰り返しリターン アドレス部分は、そのスタック フレームのリターン ポインターを上書きする必要があります。
- そのリターン アドレスは、NOP スライドの一部 (またはシェルコードの先頭) のアドレスでなければなりません。
私が理解していないのは、この手法を使用するマルウェアが常にこれら 2 つのことを正しく行う方法です。有効なペイロードを作成するために、攻撃者はターゲット バッファのおおよそのアドレスと、リターン アドレスからのおおよその距離を知る必要があるように思えます。
これら2つは通常かなり決定論的ですか?たとえば、攻撃者が自分のマシンで動作するまで試行錯誤を繰り返した場合、その同じペイロードが、まったく同じバイナリを使用する他のすべてのマシンで動作するでしょうか?