プログラミングエラーの結果として、セグメンテーション違反が発生します。しかし、必要なツールとして同じことを試みますが、カーネルはそれをスタックを破壊していると検出します。カーネルはどの程度正確に違いを認識していますか?
2 に答える
簡単に言えば、いいえ。セグメンテーション違反とは、カーネルが無効なメモリアクセスを検出し、プロセスを強制終了した場合です。一部の無効なメモリアクセスはカーネルで検出できず、スタックオーバーフローはこれらに基づいて構築されます。ただし、スタックオーバーフローはコンパイラによって検出でき、最近のバージョンのgcc(4.1+)には、スタックスマッシング攻撃に対する保護機能が組み込まれています。基本的に、「カナリア」値はスタックフレーム間のスタックに配置されます。カナリアがまだ正しい値を持っていることを確認するためのチェックがあります。そうでない場合(上書きされ、上書き者が正しい値を推測できなかったため)、スタックスマッシング保護ルーチンが実行されます。詳細については、http: //en.wikipedia.org/wiki/Buffer_overflow_protection#GCC_Stack-Smashing_Protector_.28ProPoliceを参照してください。http://wiki.osdev.org/GCC_Stack_Smashing_Protector
「-fno-stack-protector」を使用してgcc保護を無効にすることができます。詳細については、「Linuxカーネル2.6.38.7でスタックスマッシングコードが機能しない...」を参照してください。
逆に、セグメンテーション違反は、プログラムのどこかで発生する無効なメモリアクセスです。つまり、カーネルは、プログラムの許可されたメモリ領域にないメモリへのアクセスを検出します。AFAIKこれは、x86セグメントと仮想メモリの組み合わせを使用してチェックされます。アクセスが元のプログラムコードにあったのか、コードが何らかの形で悪用されたのかをカーネル/OSが知る実際の方法はありません。いずれにせよ、プログラムはアクセスできないメモリにアクセスしようとしているため、強制的に終了します。
セグメンテーション違反はスタックの破壊と同じではありませんか?
いいえ、セグメンテーション違反は、オペレーティングシステムが無効なメモリアクセスを検出してプロセスを終了した場合です。スタックのスマッシングとは、通常、ローカルで宣言された配列をオーバーフローさせることによって、スタック上のアドレスを上書き(リターン)する行為を指します。
(攻撃者として)スタックを破壊する場合の目標は、選択したコードを実行するプロセスを取得することです。セグメンテーション違反は、引き継ごうとしているプロセスを強制終了するため、回避する必要があります。
プログラミングエラーの結果として、セグメンテーション違反が発生します。
ええと、いくつかのエラーはセグメンテーション違反を引き起こします、はい。他のエラーは何もしないか、単に間違った結果を引き起こします(たとえば、攻撃者がバッファオーバーフローを悪用して、プログラムにまったく異なるコードを実行させた場合など)。
しかし、必要なツールとして同じことを試みますが、カーネルはそれをスタックを破壊していると検出します。
あなたが今何を言ったかはわかりませんが、カーネルは「スタックの破壊」を検出しません。
カーネルはどの程度正確に違いを認識していますか?
何の違い?