問題タブ [stack-smash]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
buffer-overflow - execstack がある場合、位置に依存しない実行可能ファイル (PIE) のポイントは何ですか?
私はHacking: The art of exploreationを読んでいますが、明らかに古い情報でいっぱいです (カナリア、非実行可能スタック、ASLR は考慮されていません)。最新のシステムでもスタックオーバーフロー攻撃が可能かどうか (およびその方法) を理解しようとしています。私がこれまでに見つけた最高の論文は、最新の Linux システムでの Stack smashing で、少なくとも 2012 年のものです。
スタック オーバーフロー攻撃が任意のコードを実行するのを妨げているのは、カナリアと位置に依存しない実行可能ファイル (gcc でフラグ-fno-stack-protector
とを無効にする) の両方であるように思われ-fPIE
ます。PIE はスタックを実行不可能にするため、リターン アドレスをスタック アドレスで上書きできたとしても、スタック上のコードの実行が許可されないため、プログラムがクラッシュします。
どうやら、Linux ターミナル コマンドreadelf -l <filename>
を使用すると、実行可能ファイルが PIE をオンにしてコンパイルされたかどうかを知ることができます。GNU_STACK
確認する必要があるのはヘッダーです。ヘッダーがある場合は実行RWE
が許可され、ヘッダーがない場合は許可されE
ません。そのため、スタックが実行可能かどうかを確認するのは簡単です。(ソフトウェアを逆アセンブルまたはクラッシュせずに、ファイルがカナリア保護をオンにしてコンパイルされたかどうかを確認するのは簡単ではないことを指摘する価値があります)
ただし、私が理解している限り、ヘッダーはexecstackという小さなツールを使用してGNU_STACK
簡単に調整できます。と同じくらい簡単です。root 権限も必要ありません (もちろん、ファイルの所有者が root でない限り)。RWE
execstack -s <filename>
さて、私の質問は次のとおりです。設定を簡単に変更できる場合、PIE のポイントは何ですか? カナリアチェックはアセンブリコードに組み込まれているため、カナリアを無効にするにはファイル全体を再コンパイルする必要がありますが、GNU_STACK
ヘッダーは非常に誤りやすいようです...何が欠けていますか?
更新:「攻撃者がヘッダーを変更できる場合、それは攻撃者が既にコード インジェクションを達成していることを意味します。」これが本当かどうかはわかりません。攻撃者が実行可能ファイルの欠陥を悪用したい場合、別の実行可能ファイルが必要になる可能性があります。たとえば、「ハッキング: 搾取の技術」という本では、 の欠陥notesearch
は を介した悪用notesearch_exploit
です。実行不可能なスタックがある場合でも、 (root 権限がないという事実を考慮して) notesearch
execstack への適切な呼び出しを介して簡単に実行可能にすることができるため、PIE の制限を回避できます。notesearch_exploit
これは正しくありませんか?