先明确两个概念,是栈顶溢出还是栈上数组溢出。
栈顶溢出一般是递归调用层数过多,栈地址超出了栈顶。如果在libc实现中,分配栈地址的时候在前面用mmap+mprotect分配了一个stack guard page,就会触发SIGBUS;
但更多的时候是栈上数组的溢出,如果是写溢出会写入到其它变量,甚至栈上保存的寄存器压栈区、上一层函数的变量等,很大几率导致崩溃,也可能会触发任意代码执行。
比如接受用户输入参数,拷贝到栈上数组时没有检查长度,用户就可以构造payload进行攻击。
这种防范没有实际上的好办法,可以通过在当前栈首增加stack check位的方式,如果被改写就跳转到stack_chk_fail,但是并不能确保不出问题
--
FROM 123.58.117.*