バッファオーバーフローを利用して関数の戻り先アドレス書き換えるサンプルとか見かけるけど、自分でやったことがなかったので、やってみた。 ソースコード (test.c) #include <stdio.h> void hack() { printf("Hacked!\n"); } void func() { int a[1]; a[2] = &hack; } int main() { func(); return 0; } 実行 Ubuntu13.04の32ビット版上のgcc 4.7.3でコンパイルし、実行。 $ gcc test.c $ ./a.out Hacked! Segmentation fault (コアダンプ) 関数hackはどこからも呼ばれないはずですが、実行され、その後セグメンテーションエラーでプログラムが終了しました。 解説 C言語のプログラムでは、関数が呼び出されると、スタ