補遺B. 古典的な命令配置の地図
B.1 入力領域に命令を置く考え方
古典的なスタック上コード実行は、一つの入力の中に「命令バイト」「返り先までの間隔」「命令バイトがある位置」を概念的に置く。retが最後の位置をRIPへ入れ、CPUが入力領域から命令を取得する。NXが有効な通常環境では実行権限検査で止まる。
B.2 環境変数へ置く考え方
プロセス起動時、コマンド行引数と環境変数は初期スタックに関連する形で配置される。そこに大きなバイト列を置き、戻り先だけをその位置へ向ける古典的な考え方がある。実際の位置は引数長、環境、カーネル、ASLRなどに影響される。
B.3 NOPスレッドが緩和するもの
NOPスレッドは、目的の命令列の前にNOPを広く置く。着地点のずれに対する許容範囲を広げるが、実行不可ページ、大きな位置の不確実性、カナリの検出を無効化するものではない。