D_FORTIFY_SOURCEを使う
これもバッファーオーバーフロー検出に関するお話。
gcc4からの機能です。
使い方 (o1以上の最適化オプションをつける)
gcc -O1 -D_FORTIFY_SOURCE=1 foo.c
検出時は、下記のいずれか
- コンパイル時
- 実行時
これの機能のすごいとこは、リリースビルドで使えるということ。
- 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でバックトレースできるよ。