MultiCanary 実装結果

 #include <stdio.h>
 
 int main(int argc, char **argv) {
   char a[30];
   char b[30];
 
   printf("a: ");
   scanf("%s", a);
   printf("b: ");
   scanf("%s", b);
 
   printf("a: %s\n", a);
   printf("b: %s\n", b);
 
   return 0;
 }

普通にコンパイルする場合

 $ clang twobuf.c -o twobuf

60文字以上打つとCanaryを書き換えるが

 $ ./twobuf
 a: 
 AAAAAAAAAAAAA
 b: 
 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
 a: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
 b: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
 *** stack smashing detected ***: <unknown> terminated
 fish: “./twobuf” terminated by signal SIGABRT (Abort)
 

バッファの片方(a)のみを書き換える場合は反応しない

 $ ./twobuf
 a: AAAA
 b: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
 a: BBBBBBBBBBBBBBBBBBBBB
 b: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

MultiCanaryを使うとき

 $ clang -emit-llvm twobuf.c -c -o twobuf.bc
	$ ../../llvm-build/bin/opt -load ../../llvm-build/lib/LLVMMultiCanary.so -multicanary < twobuf.bc > twobuf_opt.bc
 $ ../../llvm-build/bin/llc twobuf_opt.bc -o twobuf_opt.s
 $ gcc twobuf_opt.s -o twobuf_opt
 $ ./twobuf_opt
 

Backlinks