D_FORTIFY_SOURCEを使う

これもバッファーオーバーフロー検出に関するお話。
gcc4からの機能です。

使い方 (o1以上の最適化オプションをつける)

gcc -O1 -D_FORTIFY_SOURCE=1 foo.c

検出時は、下記のいずれか

  1. コンパイル時
  2. 実行時

これの機能のすごいとこは、リリースビルドで使えるということ。

  • gオプションがいらないので、リリースするモジュールにも積極的に使えるということ。
#include <string.h>
static char buf[6];
int main(int argc, char** argv)
{
    strcpy(buf, argv[1]);
    return 0;
}    

こんなソースを実行すると下記の感じになる。

======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 10888991   /home/hidekazu/src/c/tmp/a.out
08049000-0804a000 rw-p 00000000 08:01 10888991   /home/hidekazu/src/c/tmp/a.out
08d3a000-08d5b000 rw-p 00000000 00:00 0          [heap]
46e97000-46eb6000 r-xp 00000000 08:01 9179830    /usr/lib/ld-2.15.so
46eb6000-46eb7000 r--p 0001e000 08:01 9179830    /usr/lib/ld-2.15.so
46eb7000-46eb8000 rw-p 0001f000 08:01 9179830    /usr/lib/ld-2.15.so
46eba000-47065000 r-xp 00000000 08:01 9179839    /usr/lib/libc-2.15.so
47065000-47066000 ---p 001ab000 08:01 9179839    /usr/lib/libc-2.15.so
47066000-47068000 r--p 001ab000 08:01 9179839    /usr/lib/libc-2.15.so
47068000-47069000 rw-p 001ad000 08:01 9179839    /usr/lib/libc-2.15.so
47069000-4706c000 rw-p 00000000 00:00 0 
47582000-4759e000 r-xp 00000000 08:01 9180054    /usr/lib/libgcc_s-4.7.2-20120921.so.1
4759e000-4759f000 rw-p 0001b000 08:01 9180054    /usr/lib/libgcc_s-4.7.2-20120921.so.1
b7769000-b776a000 rw-p 00000000 00:00 0 
b7781000-b7783000 rw-p 00000000 00:00 0 
b7783000-b7784000 r-xp 00000000 00:00 0          [vdso]
bffb8000-bffd9000 rw-p 00000000 00:00 0          [stack]
中止 (コアダンプ)

コアダンプするので、ulimited -c unlimitedとかしてcoreファイルを
はけばgdbでバックトレースできるよ。