NOPスレッド
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/22 07:15 UTC 版)
「バッファオーバーラン」の記事における「NOPスレッド」の解説
上で述べた攻撃のアイデアが実行可能であるためには、攻撃者がリターンアドレスに上書きすべき仮想アドレスを正確に知り、それを関数gに入力する必要があるが、スタックは動的に変化するため、これは容易ではない。そこで本節ではリターンアドレスに上書きすべき仮想アドレスの「おおよその値」さえ分かれば攻撃が可能になるテクニック(NOPスレッド)を述べる。 NOPとは「何も行わない」事を意味するアセンブリ命令で、本来はタイミングを合わせるなどの動機により何もせずにCPU時間を消費するために用いられる。NOPスレッド(sled、そり)とはこのNOP命令を複数個並べたもので、これを利用する事により攻撃対象の関数をシェルコードの位置まで滑走させる。 具体的には攻撃者は下記のような文字列を攻撃対象の関数gに入力する: NOP … NOP (シェルコード)(戻りアドレス)…(戻りアドレス) 最初の「NOP … NOP」の部分がNOPスレッドである。攻撃者がNOPスレッドの長さや戻りアドレスの繰り返し回数を適切に選んでgに入力すると、スタック領域は例えば以下のようになる(攻撃に関係する部分だけ抜書き): gのスタックフレーム fのスタックフレーム … gの局所変数 gのSFP gのリターンアドレス … … NOP… NOP … NOP …NOP (シェルコード)…(戻りアドレス)…(戻りアドレス) (戻りアドレス) (戻りアドレス)… これでgのリターンアドレスは「戻りアドレス」にセットされるので、攻撃者が「戻りアドレス」としてNOPスレッド部分のアドレスを指定する事に事前に成功していれば、gの終了時にNOPスレッドへとプログラムカウンタが移動する。するとプログラムはNOPを順に実行して右へ右へと移動し、シェルコードの位置にたどり着いてシェルコードが実行されるので、攻撃成功となる。戻りアドレスがNOPスレッドのどこかに落ちさえすればよいので、前節で述べた攻撃違い、リターンアドレスにセットする値を完璧に制御する必要はなく、NOPスレッドの長さ分の誤差が発生しても攻撃が成功する事になる。 NOPスレッドは頻繁に使用されるため、多くの侵入防止システムベンダーでシェルコードの判定に使用されている。このため、エクスプロイトの作成者側では、シェルコードの実行に影響を及ぼさない(NOP以外の)任意の命令をランダムに選んでスレッドを構成することが常套手段となっている。
※この「NOPスレッド」の解説は、「バッファオーバーラン」の解説の一部です。
「NOPスレッド」を含む「バッファオーバーラン」の記事については、「バッファオーバーラン」の概要を参照ください。
- NOPスレッドのページへのリンク