バッファオーバーフロー
strcpy等のバッファオーバーフローが起こりやすい関数の使用に対して警告を出してくれる関数名照合型検査ツールや、各種ソースコード検査ツールを使用してバッファオーバーフロー対策を行う。開発環境の中にはソースコード検査ツールをオプションとして備えているものもあるので、それを利用する事もできる。
またソースコードが手に入らない製品等を利用する場合は、ファジングツールでブラックボックス解析する。
より高度なヒープベースバッファオーバーフロー攻撃として、mallocがメモリ管理に使うメタデータを書き換える手法がある。例えばWindows XP SP1またはそれ以前のWindowsでは、mallocしたメモリ領域をオーバーフローさせる事で、そのメモリ領域の(仮想アドレス空間で)隣りにある未使用chunkのflinkやblinkを任意のアドレスに書き換えるという攻撃手法が可能であった。flinkやblinkはcoalesceのタイミングでmallocにより参照されるので攻撃が成功する。
スタック領域はプロセス中で呼ばれる関数のコールスタックを格納する領域で、コールスタック中の各関数のデータ(スタックフレームという)を並べて格納している。プロセス中で関数fが関数gを呼び出した場合、コールスタックは以下のようになる:
プロセスで現在実行中の関数のスタックフレームの位置を覚えるためにプロセッサによって用いられるのがフレームポインタで、具体的には(現在実行中の関数がgであれば)gのSFPのアドレスを指している。SFPは関数呼び出し時に呼び出し元の関数のフレームポインタのアドレスを覚えるための領域で、fがgを呼び出した際、スタックフレームの値(=fのSFPのアドレス)をgのSFPに格納する。なお、SFPは「Saved Frame Pointer」の略で、日本語訳は「退避されたフレームポインタ」である。
一方gのリターンアドレスは呼び出し元関数fのプログラムカウンタのアドレスを格納する。