Cでアプリケーションを作成しましたが、コンパイル時に-fno-stack-protector
コマンドの目的を理解しようとしています。私の特定のアプリケーションでは、このコマンドを使用しても、バッファオーバーフローに対する保護の観点からも、違いはありません。
-fstack-protector
および-fno-stack-protector
コマンドがそれぞれスタックスマッシングプロテクターを有効または無効にすることをオンラインで読みましたが、アプリケーションを自分でコンパイルする場合、事前にどのようにプロテクターを有効にできますか?コマンドの使用は、アプリケーションが実行されているシステムに依存する可能性がありますか?
標準/ストックGCCでは、スタックプロテクターはデフォルトでオフになっています。ただし、一部のLinuxディストリビューションでは、GCCにパッチを適用してデフォルトでオンにします。私の意見では、これはかなり有害です。Makefileが特にスタックプロテクターを無効にしない限り、標準ユーザー空間ライブラリにリンクされていないものをコンパイルする機能を破壊するからです。このハックのあるディストリビューションがGCCに追加のハックを追加してカーネルがビルドされていることを検出し、それを無効にすることを除いて、Linuxカーネルビルドを壊すことさえあります。
_-fstack-protector
_でコンパイルする場合、コードがチェックを設定してから実際にチェックしているかどうかで、スタックに割り当てられるスペースが少し増え、関数の出入りにオーバーヘッドが少し増えます関数内でスタックを上書きしました。
それはあなたのアプリケーションに違いをもたらします。有効にすると、スタックオーバーフロー攻撃を迅速に回避します。コードに関数呼び出しがない場合にのみ、プログラムに影響を与えません(そして、通常main()
を記述します。これはスタートアップコードによって呼び出される関数であるため、プログラム)。ただし、使用できる攻撃はスタックオーバーフロー攻撃だけではないため、万能薬ではありません。しかし、限られたコストで有用な保護です。
保護はシステム自体に依存しません。使用しているコンパイラのバージョンによって異なりますが、それだけです。
スタックプロテクターは、コンパイラとplaced intoプログラムによって生成されるコードです。プログラムによって呼び出されるのは、外部プログラムまたはシステムコールではありません。
mayこれをオフにしたい理由は3つあります。
デフォルトのコンパイラ設定に一致するオプションが役立つ可能性がある時間は次のとおりです。
あなたが微調整したい複雑な構成を持つかもしれないビルドシステムを使用しているとき。メークファイルの迷路の中でfstack-protector
(たとえば)を使用することを選択している場所を把握する代わりに、オプションのリストの最後に簡単に追加される追加オプションを簡単に渡すことができます。 GCCがオプションのセットでfstack-protector
とfno-stack-protector
の両方を検出した場合、コマンドラインの最後の1つが有効になります。
この種のものが便利な場合(-fstack-protector
には当てはまらないようですが)は、「サブオプション」を有効にするオプションがある場合です。たとえば、-O2を設定すると、多数の-fxxx
最適化オプションが有効になります。ほとんどの場合、-O2
を使用したいが、GCCの厳密なエイリアス最適化は望ましくありません。そのため、-fno-strict-aliasing
を指定して、その特定のオプションをデフォルト設定に戻すことができます。 (注:このケースは上記のケースと実際に同等です)