web-dev-qa-db-ja.com

gccコンパイラーの最適化をオフにしてバッファーオーバーフローを有効にする方法

私は 宿題の問題 に取り組んでいます。これは、コンパイラの最適化保護を無効にする必要があります。私はubuntu linuxでgcc 4.4.1を使用していますが、どのフラグが正しいかはわかりません。私はそれがアーキテクチャに依存していることを認識しています-私のマシンは32ビットIntelプロセッサで動作します。

ありがとう。

64
sa125

それは良い問題です。この問題を解決するには、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 [〜#〜]

87
rook

ウルム、これまでの回答のすべては、ルークの回答が正しいことで間違っていました。

次を入力:

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 'フラグがないと、ページには実行不可能なスタックマーキングがあります。

30
user1831086

新しいディストリビューション(2016年現在)では、PIEはデフォルトで有効になっているようですので、コンパイル時に明示的に無効にする必要があります。

一般的なバッファオーバーフローエクササイズでローカルでプレイするときに役立つコマンドの簡単な概要を次に示します。

カナリアを無効にする:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

DEPを無効にする:

gcc vuln.c -o vuln_disable_dep -z execstack

PIEを無効にする:

gcc vuln.c -o vuln_disable_pie -no-pie

上記のすべての保護メカニズムを無効にします(警告:ローカルテストのみ):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

32ビットマシンの場合は、-m32パラメーターも追加する必要があります。

15
Aydin K.

-fno-stack-protectorフラグ。

5
Kyle Lutz

古いスレッドであることは知っていますが、バッファオーバーフローを行うためにASLRを無効にする必要はありません。 ASLRは有効(kernel_randomize_va_space = 2)ですが、コンパイルされた実行可能ファイルがPIEでない限り有効にならないため、-fPIC -pieフラグを使用してファイルをコンパイルしない限り、ASLRは有効になりません。

-fno-stack-protectorでカナリアを無効にするだけで十分だと思います。 ASLRが動作しているかどうかを確認する場合(位置に依存しないコードを設定する必要があります)、次を使用します。hardening-checkexecutable_name

4
AhlyM

ページ全体を引用することはしませんが、最適化に関するマニュアル全体はこちらから入手できます。 http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-オプション

その音から、少なくとも-O0、デフォルト、および:

-fmudflap -fmudflapth -fmudflapir

それをサポートするフロントエンド(CおよびC++)では、すべての危険なポインター/配列の逆参照操作、一部の標準ライブラリ文字列/ヒープ関数、および範囲/有効性テストに関連するその他のコンストラクトを実装します。そのようにインストルメント化されたモジュールは、バッファオーバーフロー、無効なヒープ使用、およびその他のクラスのC/C++プログラミングエラーの影響を受けません。インストルメンテーションは、リンク時に-fmudflapが指定された場合にプログラムにリンクされる別個のランタイムライブラリ(libmudflap)に依存します。インストルメント済みプログラムの実行時の動作は、MUDFLAP_OPTIONS環境変数によって制御されます。オプションについては、env MUDFLAP_OPTIONS = -help a.outを参照してください。

2
user257111