揮発性のメモ2

http://d.hatena.ne.jp/iww/

gccで、スタックを破壊している人を探してぶっ殺したい

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が使えない化石みたいに古い環境なら利用価値があるかも