34

-fno-stack-protectorC でアプリケーションを作成しましたが、コンパイル時のコマンドの目的を理解しようとしています。私の特定のアプリケーションでは、このコマンドを使用しても使用しなくても、バッファ オーバーフローから保護するという点で違いはありません。

-fstack-protectorおよび-fno-stack-protectorコマンドがそれぞれスタック破壊プロテクターを有効化および無効化することをオンラインで読みましたが、自分でアプリケーションをコンパイルしている場合、どうすればプロテクターを事前に有効にできますか? コマンドの使用法は、アプリケーションが実行されているシステムに依存する可能性がありますか?

4

5 に答える 5

23

標準/ストック GCC では、スタック プロテクターはデフォルトでオフになっています。ただし、一部の Linux ディストリビューションでは GCC にパッチを適用して、デフォルトで有効にしています。私の意見では、Makefile が特にスタック プロテクターを無効にしない限り、標準のユーザー空間ライブラリにリンクされていないものをコンパイルする機能が損なわれるため、これはかなり有害です。このハックを含むディストリビューションが GCC に追加のハックを追加して、カーネルがビルドされていることを検出し、それを無効にすることを除いて、Linux カーネルのビルドを壊すことさえあります。

于 2012-05-23T03:23:40.713 に答える
17

でコンパイルすると-fstack-protector、スタックに割り当てられるスペースが少し増え、コードがチェックをセットアップしてから実際にスタックを上書きしたかどうかをチェックする間、関数への出入りのオーバーヘッドが少し増えます。関数。

それはあなたのアプリケーションに違いをもたらします。有効にすると、スタック オーバーフロー攻撃をすばやく回避します。コードに関数呼び出しがない場合にのみ、プログラムは影響を受けません (また、通常は を記述main()し、それはスタートアップ コードによって呼び出される関数であるため、プログラムに影響を与えます)。ただし、スタック オーバーフロー攻撃だけが使用可能な攻撃ではないため、万能薬ではありません。しかし、それは限られたコストで有用な保護です。

保護はシステム自体に依存しません。使用しているコンパイラのバージョンによって異なりますが、それだけです。

于 2012-05-23T03:26:08.823 に答える
2

スタック プロテクターは、コンパイラによって生成され、プログラムに配置されるコードです。プログラムによって呼び出されるのは、外部プログラムまたはシステム コールではありません。

于 2012-05-23T03:29:57.500 に答える