大家都熟悉的安全漏洞一般都是SQL注入漏洞、缓冲区溢出漏洞、格式化字符串漏洞、XXS跨站脚本漏洞,其中栈溢出漏洞作为缓冲区溢出漏洞的一种形式,在网安中还是比较常见的,本文将从栈溢出漏洞的原理、栈溢出漏洞利用方式及防护手段进行介绍。
栈溢出漏洞原理
栈溢出漏洞是指当程序向栈中写入数据时,超过了栈空间所规定的大小,导致数据覆盖了其他内存区域。攻击者可以通过精心构造输入数据,使得程序在执行返回指令时跳转到攻击者设定的指令序列上,以达到劫持程序控制流的目的。
栈溢出漏洞利用方式
找到能够刚好覆盖返回地址的缓冲区长度,填充Shellcode并找到Shellcode所在地址,将返回地址覆盖为Shellcode地址
防护手段
- 随机栈地址,让攻击者无法知道shellcode地址,无处跳转
- 检测栈溢出,检测到则报错退出
- 栈上不能执行shellcode
接下来就是一些防护绕过思路
地址空间随机化防护绕过思路
1、如果未开启PIE,主程序不会随机化的,可绕过共享库随机化
2、×86_32架构下进行爆破(内存地址随机化粒度以页为单位:0x1000字节对齐)
3、内存地址随机化粒度以页为单位:0x1000 字节对齐
4、信息泄漏
5、在shellcode之前布置一长串nop指令 (nop sled通常跟爆破联系在一起,可以增加爆破概率)
6、堆喷 (Heap spray)
stack canary/cookie饶过思路
1、泄露Canary,每个线程不同两数的Canary都相同
2、只覆盖局部变量,不覆盖返回地址
3、修改Thread-local Storage中的Canary
栈不可执行保护思路
内存权限精细划分(可执行和可写二者不可兼得),见下图
NX/W^X/DEP绕过思路
(Return to Libc)攻击者只能执行已有代码,无法引入新代码,可以跳转到system(中执行,复用LIbc中大量函数)
下面是一个简单的脑图