Electric Fenceを使ってheapの不正アクセスを検出する
このsourceは10文字分しか確保していないのに20文字分使っています
#include <stdio.h> #include <string.h> #include <malloc.h> int main() { char *buf; int i; buf = (char*)malloc(10); for (i = 0; i < 20; i++) { fprintf(stderr, "%d\n", i); buf[i]=i; } return(0); }
$ gcc -o mem mem.c -g $ ./mem # 不正なメモリアクセスをしているのに正常終了する $ sudo apt-get install electric-fence # electric fenceをインストール $ LD_PRELOAD=/usr/lib/libefence.so ./mem # 起動時にshared libraryをloadしmemを実行する 0 1 2 3 4 5 6 7 8 9 10 11 12 Segmentation fault (core dumped) # 10byte確保しても4byte境界によって12byteにalignmentされるため12で落ちる $ env EF_ALIGNMENT=1 LD_PRELOAD=/usr/lib/libefence.so ./mem # alignmentをoffしmemを実行 0 1 2 3 4 5 6 7 8 9 10 Segmentation fault (core dumped)
buffer underflow
env EF_PROTECT_BELOW=1 LD_PRELOAD=/usr/lib/libefence.so ./mem
EF_PROTECT_FREE 1 | free() 後のアクセス不許可 |
EF_ALLOW_MALLOC_0 0 | malloc(0) の不許可 |
EF_PROTECT_BELOW 0 | ヒープの上へのアクセス不許可 |
EF_PROTECT_BELOW 1 | ヒープの下へのアクセス不許可 |