web-dev-qa-db-ja.com

スタック破壊はどのように防止されますか?

私はスタックを破壊することについて AlephOneの論文 を読んで私のマシン(Ubuntu 12.04)に実装しました。少し古かったので、インターネットから多くの助けを借りなければなりませんでしたが、楽しんでいました。

今、私はそれが実際の生活でどのように妨げられているかを学びたいです。

それがどのように防止されているかを実証するいくつかの論文またはオンラインリソースを私に提案することができれば素晴らしいでしょう。

7
Jaydeep Solanki

スタックベースのバッファオーバーフローを軽減するには、主に2つの方法があります。

最初の手法は、問題を根本から攻撃することです。バッファオーバーフローは、プログラムがデータ構造の境界外に書き込もうとしたときに発生します。バッファオーバーフローを停止する最も効果的な方法は、これをstopで停止することです。 Java、Python、Rubyなど、プログラミング言語を使用して、メモリを管理します。 Cを使用する必要がある場合、バッファーに書き込む前に適切なチェックを実行してください。

2番目の手法では、バッファオーバーフローが引き起こす可能性のある損傷を軽減します。スタックカナリア、 [〜#〜] dep [〜#〜] および [〜#〜] aslr [〜#〜] などの手法はこのカテゴリに分類されます。それらは、オーバーフロー後に攻撃者が任意のコードを実行することをより困難にすることにより、バッファオーバーフローが引き起こす可能性のあるダメージを制限するように機能します。このようなテクニックは無効にすることができます。 DEPとASLRの詳細については、 this の質問を参照してください。

12
user10211

ほんの小さなメモ:

テストにUbuntu 12.04を使用していたので、システムにコマンドを与えている必要があります(インターネットから多くの助けを得て、これが初めてスタックを破壊しようとしたとき)。

echo 0 > /proc/sys/kernel/randomize_va_space

またはいくつかの関連コマンド。このコマンドは基本的に、システムで [〜#〜] aslr [〜#〜] (Terryが言及)を無効にします。デフォルトでは、ASLRはカーネルバージョン2.6以降で有効になっている機能です。

(実際にこれをコメントとして投稿したかったが、評判の問題のため、投稿できませんでした:))

4
Rahil Arora