この質問に答える良い情報源が見つかりません。nopスレッドは、バッファオーバーフロー攻撃でスタックのランダム化を回避するために使用される手法であることは知っていますが、それがどのように機能するかについて頭を悩ませることはできません。
この方法を説明する簡単な例は何ですか?
128バイトのnopsledのような用語はどういう意味ですか?
この質問に答える良い情報源が見つかりません。nopスレッドは、バッファオーバーフロー攻撃でスタックのランダム化を回避するために使用される手法であることは知っていますが、それがどのように機能するかについて頭を悩ませることはできません。
この方法を説明する簡単な例は何ですか?
128バイトのnopsledのような用語はどういう意味ですか?
一部の攻撃は、プログラムを特定のアドレスにジャンプさせ、そこから実行を継続させることで構成されます。挿入されたコードは、その正確な場所に何らかの方法で事前にロードする必要があります。
スタックのランダム化やその他の実行時の違いにより、プログラムがジャンプするアドレスを予測できなくなる可能性があるため、攻撃者はNOPスレッドを広い範囲のメモリに配置します。プログラムがスレッドのどこかにジャンプすると、残りのすべてのNOPが実行され、何も実行されません。次に、スレッドのすぐ隣でペイロードコードが実行されます。
攻撃者がNOPスレッドを使用する理由は、ターゲットアドレスを大きくするためです。コードは、挿入されたコードの先頭ではなく、スレッド内のどこにでもジャンプできます。
128バイトのNOPスレッドは、128バイト幅のNOP命令のグループにすぎません。
注1:NOP(No-OPeration)は、ほとんどの(すべて?)アーキテクチャで使用可能な命令であり、メモリとランタイムを占有する以外は何もしません。
注#2:可変長命令を使用するアーキテクチャでは、NOP命令は通常1バイトの長さであるため、便利な命令パディングとして使用できます。残念ながら、それによってNOPスレッドを簡単に実行することもできます。
ロドリゴの説明に追加するには-NOPスレッドを使用する場合でも、メモリ内のバッファのおおよその位置を事前に予測する必要があります。のメモリ位置を概算するための1つの手法は、近くのスタック位置を参照フレームとして使用することです。この位置からオフセットを引くことにより、任意の変数の相対アドレスを取得できます。
補足:x86アーキテクチャでは、NOP命令は16進バイト0x90と同等であるため、完成したエクスプロイトバッファは次のようになります。
| NOPスレッド| シェルコード| 繰り返しの差出人住所|
EIPレジスタがNOPスレッドで見つかったアドレスを指しているように見えるため、各NOP命令の実行中に、最終的にシェルコードに到達するまで、一度に1つずつインクリメントされます。