メモリリークなどを探すツール・Electric Fenceを使ってみる †mallocのフリー忘れやサイズ0のメモリアロケートなどを検出してくれるElectric Fenceを使ってみました。 使用したOSはCentOS5のx86_64になります。 スポンサーリンク 関連資料・関連記事 †
Electric Fenceのインストール †Electric Fenceは以下のパッケージになります。
ともに以下のコマンドでインストールすることができます。 yum -y install ElectricFence Electric Fenceを使ってみる †早速、Electric Fenceを使ってみます。 Electric Fenceの使う順序 †以下の手順でElectric Fenceを使うことができます。
バッファーオーバーフローを試す †使用したバッファーオーバーフローのCソースは以下の通りです。 #include <stdio.h> #include <stdlib.h> int main(void) { char *c; c = malloc(4); c[4] = 0; free(c); exit(0); } 上記のプログラムはバッファーオーバーフローしていますが、実行するとなにもエラーなく終了してしまいます。 Electric Fenceを使って実行してみます。
上記のようにElectric Fenceを使うとセグメンテーション違反が発生します。 $ unset LD_PRELOAD $ gdb -c core.5705 over GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1) Copyright (C) 2009 Free Software Foundation, Inc. <snip> warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff9b54f000 Core was generated by `./over'. Program terminated with signal 11, Segmentation fault. #0 0x0000000000400546 in main () at over.c:8 8 c[4] = 0; バッファーアンダーフローを試す †アンダーフローも上記のオーバーフロート同様の手順ですが、EF_PROTECT_BELOWが異なります。 使用したバッファーアンダーフローのCソースは以下の通りです。 #include <stdio.h> #include <stdlib.h> int main(void) { char *c; c = malloc(4); c[-1] = 0; free(c); exit(0); } 上記のプログラムはバッファーアンダーフローしていますが、実行するとなにもエラーなく終了してしまいます。 Electric Fenceを使って実行してみます。
上記のようにElectric Fenceを使うとセグメンテーション違反が発生します。 $ unset LD_PRELOAD $ gdb -c core.5757 under GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1) Copyright (C) 2009 Free Software Foundation, Inc. <snip> warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fffabffd000 Core was generated by `./under'. Program terminated with signal 11, Segmentation fault. #0 0x0000000000400546 in main () at under.c:8 8 c[-1] = 0; サイズ0のmallocを検出する †サイズ0をmallocをするサンプルソースを準備しました。 #include <stdio.h> #include <stdlib.h> int main(void) { char *c; c = malloc(0); free(c); exit(0); }
上記のようにElectric Fenceを使うと「不正な命令です (core dumped)」が発生します。 $ unset LD_PRELOAD $ gdb -c core.5845 zero GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1) Copyright (C) 2009 Free Software Foundation, Inc. <snip> warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff8e8a7000 Core was generated by `./zero'. Program terminated with signal 4, Illegal instruction. #0 0x0000003dbd630717 in kill () from /lib64/libc.so.6 (gdb) bt #0 0x0000003dbd630717 in kill () from /lib64/libc.so.6 #1 0x00002b16158e7005 in ?? () from /usr/lib64/libefence.so #2 0x00002b16158e755d in EF_Abort () from /usr/lib64/libefence.so #3 0x00002b16158e6bfe in memalign () from /usr/lib64/libefence.so #4 0x000000000040053a in main () at zero.c:7 bt(バックトレース)コマンドを実行するとzero.cの7行目(c = malloc(0);)が原因なのが確認できます。 サイズ0のチェックを行わない場合は、以環境変数EF_ALLOW_MALLOC_0に1を設定してください。 $ export EF_ALLOW_MALLOC_0=1 その他環境変数 †Electric Fenceの環境変数に関しては、manコマンドで調べることができます。 man libefence スポンサーリンク |