バッファ オーバーフローに関する本を読みましたが、次の対処法が提案されています。
スタック (およびヒープ) を実行不可にすると、既存のプログラムに対するさまざまな種類のバッファ オーバーフロー攻撃に対する高度な保護が提供されます。
しかし、どうすればそれができるのかわかりません-ヒープやスタックではない場合、実行はどこで行われますか?
バッファ オーバーフローに関する本を読みましたが、次の対処法が提案されています。
スタック (およびヒープ) を実行不可にすると、既存のプログラムに対するさまざまな種類のバッファ オーバーフロー攻撃に対する高度な保護が提供されます。
しかし、どうすればそれができるのかわかりません-ヒープやスタックではない場合、実行はどこで行われますか?
私があなたの質問を正しく理解していれば、他のどの回答もそれに対処していません。答えは、スタックでもヒープでもないコード セクションで実行が発生することです。典型的なページ メモリ システムでは、プログラム ファイル (Windows の .exe など) のコードは、実行可能ではあるが読み取り専用のページに読み込まれます。追加の書き込み可能 (および実行可能) ページは、スタックとヒープのプロセスに割り当てられます。ここでの提案は、オペレーティング システムとハードウェアが協力して、これらのページを書き込み可能で実行可能ではないとマークする必要があるということです (rgngl の回答では、Windows でそれを行う方法が説明されています)。
実行不可能なヒープとスタックを使用しても、Alexey Frunze の回答で言及されているリターン指向プログラミングを使用するエクスプロイトは依然として可能ですが、スタックスマッシング保護やアドレス空間レイアウトのランダム化など、それらを妨害する保護手法もあります-参照http://en.wikipedia.org/wiki/Return-to-libc_attack#Protection_from_return-to-libc_attacks
「リターン指向プログラミング」(AKA ROP)タイプのエクスプロイトと呼ばれるものがあります。
攻撃者は、悪用されているプログラムのさまざまな部分から悪意のあるコードを作成する方法を見つけます。
彼は、ある場所への値の移動、値の追加、値の比較など、レジスタまたはメモリに対して有用な操作を実行できる戻り命令バイトの前に、使用可能なバイト シーケンス (命令) を見つけます。これらは、エクスプロイトが取得するマイクロ サブルーチンです。で構築されました。
次に、コードのバグを悪用して、攻撃者はプログラムに、すべての邪悪な作業を行う一連のマイクロ サブルーチンの実行を強制します。
つまり、良いコードは悪いコードに変わります。スタックまたはヒープでは何も実行されません。
また、命令が複数のバイトにまたがり、可変長である CPU では、命令の一部である即値命令オペランド (IOW、数値定数) でさえコードになる可能性があるため、使用可能なバイト シーケンスを見つける可能性がそこでより高いことも注目に値します。 「より単純な」CPUで。
メモリ保護を変更する悪意のあるコードを作成することもしばしば可能であり、悪用は既存のアプリケーションのコードによって制限されなくなります。
非常に具体的な例:リターンアドレスが指すようにsystem
配置し、スタックの次のスロット(またはレジスタパスアーチの最初の引数レジスタ)が文字列へのポインタになるように配置します"/bin/sh"
。
この種の保護は OS によって提供され、アプリケーション層では実行できません。
Windows で有効にする方法についても説明しているウィキペディアの記事を参照してください: http://en.wikipedia.org/wiki/Data_Execution_Prevention
実行可能セグメントである他の場所にジャンプして、邪悪なコードを実行できます...
結局のところ、任意のストレージ上のすべてのデータ、メモリはビットであり、ビットは実行する CPU への命令になる可能性があります。
オーバーフローを使用して、関数の戻りアドレスを上書きできます。これにより、コードが含まれている既知のアドレスにジャンプできます。しかし、その後、OS ライターは、実行されるアドレス コードをランダム化することで応答しました...