[Linux,C言語]GCC の -fstack-protector

スポンサーリンク

参考URL:
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c905.html

(1) GCC の -fstack-protector
このオプションを指定してC言語のソースコードをコンパイルすると、プログラムはスタック上の変数のあふれによって生じた関数リターンアドレスの書き変えを検出するようになる。
$ gcc -fstack-protector 他のオプション foo.c ...
このオプションは厳密には、スタックの中の関数リターンアドレスの付近で不適当な値の書き変えが起こっていることを検知するものである。
このオプションが指定されていないとき、関数リターンアドレスの付近のスタックの内容は次のようになっている(Intel 32 ビットアーキテクチャの場合)。
このコンパイルオプションをつけてコンパイルされた関数では、ebp退避領域と関数リターンアドレスの前に4バイトの「カナリア」と呼ばれるワードが配置される。
カナリアは、ローカル変数領域のあふれによるスタック破壊を検知するためのものである。このオプションが付けられてコンパイルされた関数では、関数からのリターン直前にカナリアの値が書き変わっていないかがチェックされ、スタック破壊が検出される。
スタック破壊検出コードの生成はすべての関数に対して行われるのではない。ローカル変数に文字配列が無いか、あっても8バイト未満である関数には、スタック破壊検出コードは生成されない。なお、この8バイトというしきい値は、次のオプションを用いて変更できる。
--param ssp-buffer-size=N
また、次のオプションを使うことでコンパイルするどの関数についてもスタック破壊検出コードを生成させることができる。
-fstack-protector-all
このほか、-fstack-protector オプションでは、スタック上に配列とポインタ変数の両方が存在するときに、ポインタ変数のほうが配列よりも若い(小さい)アドレスの側に配置されるよう変数の位置関係を調整するはたらきをもつ。これは、配列があふれたときの影響をなるべく少なくする工夫である。

コメント

タイトルとURLをコピーしました