gccで、スタックを破壊している人を探してぶっ殺したい。
#include <stdio.h> #include <string.h> void fn1() { int c=0; // intは4バイト。5~12で静かに破壊。13以上でSegv memset(&c, 0x55, 16); // memsetが最適化で消えないように printf("c=0x%x\n", c); } int main() { fn1(); return 0; }
$ gcc -g -fstack-protector-all stack.c $ ./a.out c=0x55555555 *** stack smashing detected ***: terminated Aborted (core dumped)
スタックを破壊するとAbortしてくれる。 ulimitを設定しておけばcoreも吐く。
ただし、「マジックナンバーを敷き詰めておいて、誰かが破壊したあとに照合して検知する」という方法らしいので、派手に破壊されたときはcoreを見ても意味がない。
-fsanitize=address でもスタックオーバーフローは検知してくれるしこれで検知できたときはスタックの中身がピンピンしてるので、 -fstack-protector は使わないかも
依存ライブラリが無いので、ASANが使えない化石みたいに古い環境なら利用価値があるかも