web-dev-qa-db-ja.com

NOPスレッドはどのように機能しますか?

この質問に答える良い情報源が見つかりません。 nopスレッドは、バッファオーバーフロー攻撃でスタックのランダム化を回避するために使用される手法であることは知っていますが、その仕組みを理解することはできません。

この方法を示す簡単な例は何ですか?

128バイトのnop sledのような用語はどういう意味ですか?

54
amorimluc

一部の攻撃は、プログラムを特定のアドレスにジャンプさせ、そこから実行を継続することで構成されます。挿入されたコードは、その正確な場所に何らかの形で事前にロードする必要があります。

スタックのランダム化とその他のランタイムの違いにより、プログラムがジャンプするアドレスを予測できなくなる可能性があるため、攻撃者はNOPスレッドを広い範囲のメモリに配置します。プログラムがスレッドのどこかにジャンプした場合、残りのすべてのNOPを実行して何も実行せず、スレッドのすぐ隣でペイロードコードを実行します。

攻撃者がNOPスレッドを使用する理由は、ターゲットアドレスを大きくするためです。コードは、挿入されたコードの最初ではなく、スレッド内のどこにでもジャンプできます。

128バイトのNOPスレッドは、128バイト幅のNOP命令の単なるグループです。

注#1:NOP(No-OPeration)は、ほとんどの(すべて?)アーキテクチャで利用可能な命令であり、メモリとランタイムを占有する以外は何もしません。

注#2:可変長命令を使用するアーキテクチャでは、NOP命令は通常1バイトの長さしかないため、便利な命令パディングとして使用できます。残念ながら、これによりNOPスレッドの実行も簡単になります。

72
rodrigo

Rodrigoの説明に追加するには-NOPスレッドを使用しても、メモリ内のバッファのおおよその位置を事前に予測する必要があります。のメモリ位置を概算する1つの手法は、近くのスタック位置を参照フレームとして使用することです。この位置からオフセットを減算することにより、任意の変数の相対アドレスを取得できます。

サイドノート:x86アーキテクチャでは、NOP命令は16進バイト0x90と同等であるため、完成したエクスプロイトバッファーは次のようになります。

| NOPスレッド|シェルコード|返信先の繰り返し|

EIPレジスタがNOPスレッドで見つかったアドレスを指しているように見えると、最終的にシェルコードに到達するまで、各NOP命令を一度に1つずつ実行しながら増分します。

1
Boschko