栈上的缓冲区变量发生溢出时,可能会导致非预期情况(比如返回地址被劫持)的产生,进而导致一系列的安全问题。为了缓解该问题,Linux退出金丝雀机制Stack Canaries
对栈进行保护,保护原理在下方的反汇编代码中可以看到。
一
金丝雀机制的检测逻辑
rbp-0x8
,位于局部变量之后的随机值显然不会起到什么保护作用。0x0000555555555159 <+0>: push %rbp
0x000055555555515a <+1>: mov %rsp,%rbp
0x000055555555515d <+4>: sub $0x20,%rsp
0x0000555555555161 <+8>: mov %fs:0x28,%rax
0x000055555555516a <+17>: mov %rax,-0x8(%rbp)
leave
指令及ret
指令从栈上取出数据前,取出栈上保存的随机值并进行检查,只有当数值一致时,才会遵循正常的返回逻辑。0x0000555555555187 <+46>: mov -0x8(%rbp),%rax
0x000055555555518b <+50>: sub %fs:0x28,%rax
0x0000555555555194 <+59>: je 0x55555555519b <simple_overflow+66>
0x0000555555555196 <+61>: call 0x555555555040 <__stack_chk_fail@plt>
0x000055555555519b <+66>: leave
0x000055555555519c <+67>: ret
0x00
,由于C语言中字符串以