检查了一下 gcc 手册,发现它是 -fstack-protector 生成的,这个 feature 手册上描述是在 -O1,2,... 各优化级别之外的,可能还有 bug 的额外优化选项, gentoo 上的 gcc 编译器也是遵照这个实现,不知 Ubuntu 为什么把它变成了缺省的,就是默认 enable 这个选项。
这个选项的原理就是在栈上额外分配 0,4,8,12,16 字节内存,使用 %gs:0x14 进行赋值,在函数结束时检查所赋值是否还存在,如果变化了说明栈可能遭受了溢出攻击,运行它会提示 "stack smashing"
$ ./a.out 0xffe80358, ffe80374 0xffe80354, 0 *** stack smashing detected ***: ./a.out terminated ======= Backtrace: ========= /lib32/libc.so.6(__fortify_fail+0x48)[0xf76dd228] /lib32/libc.so.6(__fortify_fail+0x0)[0xf76dd1e0] ./a.out[0x80484fd] [0x41414141] ======= Memory map: ======== 08048000-08049000 r-xp 00000000 08:09 130818 /home/gektop/tmp/test/a.out 08049000-0804a000 r--p 00000000 08:09 130818 /home/gektop/tmp/test/a.out 0804a000-0804b000 rw-p 00001000 08:09 130818 /home/gektop/tmp/test/a.out 085d1000-085f2000 rw-p 00000000 00:00 0 [heap] f75f6000-f75f7000 rw-p 00000000 00:00 0 f75f7000-f7734000 r-xp 00000000 08:0a 5808 /lib32/libc-2.9.so f7734000-f7736000 r--p 0013d000 08:0a 5808 /lib32/libc-2.9.so f7736000-f7737000 rw-p 0013f000 08:0a 5808 /lib32/libc-2.9.so f7737000-f773a000 rw-p 00000000 00:00 0 f773e000-f774a000 r-xp 00000000 08:0a 5784 /lib32/libgcc_s.so.1 f774a000-f774b000 r--p 0000b000 08:0a 5784 /lib32/libgcc_s.so.1 f774b000-f774c000 rw-p 0000c000 08:0a 5784 /lib32/libgcc_s.so.1 f774c000-f774e000 rw-p 00000000 00:00 0 f774e000-f774f000 r-xp 00000000 00:00 0 [vdso] f774f000-f776b000 r-xp 00000000 08:0a 5810 /lib32/ld-2.9.so f776b000-f776c000 r--p 0001c000 08:0a 5810 /lib32/ld-2.9.so f776c000-f776d000 rw-p 0001d000 08:0a 5810 /lib32/ld-2.9.so ffe6d000-ffe82000 rw-p 00000000 00:00 0 [stack] Aborted
只要能理解它的原理就可以了,演示的时候可以为了减少无关干扰项,可以使用 -fno-stack-protector 把它关闭。
No comments:
Post a Comment