私は、コンパイラの最適化保護を無効にして機能させる必要がある宿題の問題に取り組んでいます。ubuntu Linuxでgcc 4.4.1を使用していますが、どのフラグが正しいのかわかりません。アーキテクチャに依存していることに気づきました-私のマシンは32ビットIntelプロセッサで実行されます。
ありがとう。
私は、コンパイラの最適化保護を無効にして機能させる必要がある宿題の問題に取り組んでいます。ubuntu Linuxでgcc 4.4.1を使用していますが、どのフラグが正しいのかわかりません。アーキテクチャに依存していることに気づきました-私のマシンは32ビットIntelプロセッサで実行されます。
ありがとう。
それは良い問題です。この問題を解決するには、ASLR も無効にする必要があります。そうしないと、g() のアドレスが予測できなくなります。
ASLR を無効にします。
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
カナリアを無効にします。
gcc overflow.c -o overflow -fno-stack-protector
カナリアと ASLR が無効になった後は、楽しみと利益のためにスタックを破壊するで説明されているような単純な攻撃になるはずです。
ubuntu で使用されるセキュリティ機能のリストは次のとおりです: https://wiki.ubuntu.com/Security/Features NX ビットについて心配する必要はありません。g() のアドレスは常にメモリの実行可能な領域にあります。これは、TEXT メモリ セグメント内にあるためです。NX ビットは、スタックまたはヒープでシェルコードを実行しようとしている場合にのみ機能しますが、これはこの割り当てには必要ありません。
今すぐ行って、そのEIPを壊してください!
うーん、これまでのところすべての答えは間違っていて、ルークの答えは正しかった。
入力:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
に続く:
gcc -fno-stack-protector -z execstack -o bug bug.c
ASLR、SSP / Propolice、UbuntuのNoneXec(9.10に配置され、回避策はかなり簡単で、ページを実行可能ファイルとjmpとしてマップするmprotect(2)テクニックを参照)を無効にすると少し役立ちますが、これらの「セキュリティ機能」は絶対的な意味はありません。`-z execstack'フラグがないと、ページに実行不可能なスタックマーキングがあります。
-fno-stack-protector
フラグを試してみてください。
バッファ オーバーフローを行うために ASLR を無効にする必要はありません。ASLR は有効になっていますが ( kernel_randomize_va_space = 2
)、コンパイルされた実行可能ファイルが PIE でない限り有効になりません。そのため、ファイルをフラグ付きでコンパイルしない限り-fPIC -pie
、ASLR は有効になりません。
-fno-stack-protector
カナリアを無効にするだけで十分だと思います。ASLR が機能しているかどうかを確認する場合 (位置に依存しないコードを設定する必要があります)、次を使用します。
hardening-check executable_name
ページ全体を引用することはしませんが、最適化に関するマニュアル全体がここにあります: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options
その音から、少なくとも-O0
、デフォルト、および:
-fmudflap -fmudflapth -fmudflapir
それをサポートするフロントエンド (C および C++) の場合、すべての危険なポインター/配列の逆参照操作、一部の標準ライブラリの文字列/ヒープ関数、および範囲/有効性テストを備えたその他の関連する構造を計測します。このようにインストルメント化されたモジュールは、バッファ オーバーフロー、無効なヒープの使用、およびその他のクラスの C/C++ プログラミング エラーの影響を受けないようにする必要があります。インスツルメンテーションは、リンク時に -fmudflap が指定された場合にプログラムにリンクされる別のランタイム ライブラリ (libmudflap) に依存します。インストルメント化されたプログラムの実行時の動作は、MUDFLAP_OPTIONS 環境変数によって制御されます。オプションについては env MUDFLAP_OPTIONS=-help a.out を参照してください。