2

過去に、ユーザー レベルのプロセスに対してバッファ オーバーフローの悪用を行ったことがあります。ただし、脆弱なカーネル モジュールのバッファをオーバーフローさせようとすると、うまくいかないようです。これが私がすることです:

ファイルとして開いて読み書きできる脆弱なカーネル モジュールがあります。書き込み操作は境界チェックなしで行われます。そのため、書き込み操作を実行してバッファをオーバーフローさせ、シェルコードを持つ環境変数のアドレスとして戻りアドレスを上書きします。しかし、何かがうまくいかない。カーネルがクラッシュし、再起動後に /var/log/messages を開くと、eip が上書きしたアドレスを正しく指していることがわかりました。しかし、それでも「仮想アドレスでカーネル null ポインターの逆参照を処理できません」と言ってクラッシュします。これが発生する理由は何ですか? コントロールが上書きされたリターン アドレスにリダイレクトされないのはなぜですか?

注: exec-shield と ASLR をオフにして、Redhat Enterprise Linux でこれを実行しました。

4

1 に答える 1

4

カーネルは、ユーザー空間とは異なる構成 (たとえば、異なるページング テーブル、CPU 許可ビットなど) の特権モードで実行されているため、カーネルを終了せずにユーザー アドレスにジャンプすることはできません。

したがって、シェルコードをカーネルに入れるには、シェルコードをドライバーに書き込まれた (そしてカーネルにコピーされた) バッファーにパックし、何らかの方法でそのアドレスを取得する必要があります。カーネル マップにアクセスできる場合、これはそれほど難しくありませんが、最近の Linux ディストリビューションは、カーネル バグの悪用をより困難にするために、そのような機密情報へのアクセスをロックし始めています。

于 2012-09-26T04:19:36.183 に答える