Mudflapを使う
gcc4から使える機能です。バッファーオーバーフロー検出ツールです。
メモリの割り当てとして、ヒープ領域、bss領域、stack領域などがあります。このツールでは、下記のようなケースが検出されました。
/* test.c */ static char onbss[128]; int main(void) { char onstack[128] = {0}; int dummy; dummy = onbss[128]; dummy = onstack[128]; return 0; }
ビルド方法は下記になります。
gcc -g -fmudflap test.c -lmudflap
実行結果
******* mudflap violation 1 (check/read): time=1354703106.661039 ptr=0x80c9c80 size=129 pc=0xb76153ff location=`testflap.c:8:18 (main)' /lib/libmudflap.so.0(__mf_check+0x3f) [0xb76153ff] ./a.out(main+0xa5) [0x8048835] /lib/libmudflap.so.0(__wrap_main+0x4b) [0xb7614b4b] Nearby object 1: checked region begins 0B into and ends 1B after mudflap object 0x901d1e8: name=`testflap.c:1:13 onbss' bounds=[0x80c9c80,0x80c9cff] size=128 area=static check=3r/0w liveness=3 alloc time=1354703106.660965 pc=0xb7614adf number of nearby objects: 1 ******* mudflap violation 2 (check/read): time=1354703106.661411 ptr=0xbf85846c size=129 pc=0xb76153ff location=`testflap.c:9:20 (main)' /lib/libmudflap.so.0(__mf_check+0x3f) [0xb76153ff] ./a.out(main+0x11a) [0x80488aa] /lib/libmudflap.so.0(__wrap_main+0x4b) [0xb7614b4b] Nearby object 1: checked region begins 0B into and ends 1B after mudflap object 0x901e790: name=`testflap.c:5:10 (main) onstack' bounds=[0xbf85846c,0xbf8584eb] size=128 area=stack check=3r/0w liveness=3 alloc time=1354703106.661027 pc=0xb7614adf number of nearby objects: 1
一応、対応するソースコードの場所が表示されますが読みにくいです。valgrindの方が見やすいですね。ただvalgrindでは、bss領域、stack領域のオーバーフローは検出できないので、その点はすごい。
参考文献
Binary Hacks――ハッカー秘伝のテクニック100選