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
SecHack365
SecHack365は学生(と社会人)が、1年間指導を受けながらセキュリティに関連したり関連しなかったりするテーマで何かをつくる長期ハッカソン。無料で、交通費も全部出る。筆者は2018年度に、「ライブラリ・リンカ・ローダ・コンパイラetcを連携させたセキュリティ機能の開発」というテーマで参加した。