、前言
Linux下常用的拷贝函数(如strcpy、memcpy等)如果使用不规范,常常会导致栈溢出。也就是你的软件系统本身存在bug,这样就会成为别人攻击的目标。本文主要讲的是Linux系统如何给栈溢出增加防护网?攻击者又有什么手段绕过一层层防护网实现攻击?
2、栈溢出防御
2.1 地址随机化技术
Linux系统提供设置堆栈地址随机化技术,例如函数内部变量存在栈上,每次打印函数内部变量的地址,其值都是随机的。
用户可以通过读取或设置/proc/sys/kernel/randomize_va_space节点值对其属性进行修改。
其中0表示关闭地址随机化;2表示开启地址随机化。
Linux系统默认是开启了地址随机化技术的。
2.2 栈不可执行
当我们通过读取/proc/pid/maps会发现stack的权限是“rw-p”,这说明栈上的数据只有读写权限,没有执行权限。这样如果你把一段shellcode放到栈上,是无法执行的。
2.3 栈保护
在函数的入口和出口处加一段栈检测的汇编代码,用来检测rbp和返回地址是否被修改,这就是Linux的栈保护机制。
GCC编译的时候可以加-fstack-protector则开启栈保护机制,如果加上-fno-stack-protector则会取消栈保护机制。
可执行文件是否开启栈保护,可以objdump查看下汇编,如下是某函数的反汇编,可以确