缓冲区溢出攻击及防御技术
防御
能被攻击原因
C语⾔对数据和指针不⾃动进⾏边界
检测,⼀些字符串处理函数strcpy、
sprintf等存在严重的安全问题
程序员代码写的不严谨
返回地址放在堆栈的底部,可以通过
溢出覆盖放回地址
堆栈的属性⼀般是可执⾏的,是的⽽
已代码得意执⾏
提取⽤于攻击的shellcode的普遍特
征作为攻击特征,过滤掉这样的数据
包,或者触发报警
对特定的服务限定请求数据的值和范
围,⽐如,某⼀服务器要求请求数据
为可打印字符串,如果发现这⼀服务
的请求存在不可打印字符则认为发⽣
攻击
源码BUG查找,使⽤安全的函数
运⾏期保护
数据边界检查
保证放回指针的完整性
加强系统保护
保护系统信息
关闭不需要的服务
最⼩权限原则
使⽤系统的堆栈补丁
检查系统漏洞,及时打上补丁
使⽤类型安全的语⾔开发
⽅法
在程序的地址空间安排适当代码
使控制流跳转到攻击代码
函数指针
激活记录
当函数调⽤时,堆栈中会留驻⼀个
Activation Record 包含函数返回的
地址。溢出修改这⼀记录。
⻓跳转缓存区
C语⾔的 setjmp 与 longjmp
缓冲区
相同数据类型实例的⼀个连续的计算
机内存块,⽤于保存数据。
溢出
所填充的数据超出了原有的边界
代码植⼊技术
shellcode
核⼼部分,能完成特殊任务的⼆进制
代码
返回地址
shellcode的⼊⼝地址
设法⽤shellcode的⼊⼝地址覆盖某
个跳转指令
填充数据
提⾼shellcode命中率,在前⾯安排
⼀定的填充数据
模式
参数
S 代表 Shellcode
R 代表返回地址
N 代表填充数据
A 代表环境变量
NSR
RNS
AR
缓冲区溢出原理
⼀段连续内存块
代码段
存放程序的机器码和只读数据,可执
⾏指令从这⾥取得
数据段
以初始化的数据(.data)
保存全局和静态已初始化的变量
未初始化的数据(.bss)
全局和静态未初始化的变量
堆栈端
堆
位于BBS内存段的上边,⽤来存储运
⾏时分配的变量
动态扩张或缩减
malloc()、new()创建
delete()删除
栈
存储函数调⽤时临时信息结构
编译器需要的时候分配,不需要的时
候⾃动清除
先进后出队列
关注数据区和堆栈区
使⽤栈
ESP 栈顶指针
随着数据⼊栈出栈发⽣变化
EBP 基地址指针
通过BP加上偏移地址,可以⽅便的
引⽤函数参数已经局部变量
局部变量发⽣溢出,很有可能会覆盖
掉EBP设置RET(返回地址)
在堆栈中压⼊的数据超过预先给堆栈
分配的容量。
栈溢出
⾸先把指令寄存器(CPU要执⾏的下
⼀条指令地址)压⼊栈,作为程序的
返回地址(RET),之后作为栈的基
址寄存器(EBP)它指向当前函数栈
针的地步,⽽后把当前的栈顶指针,
ESP拷⻉到EBP基址寄存器,作为新
的基地址。
思维导图
堆溢出
不如栈溢出流⾏
⽐栈溢出难度更⼤
需要结合其他技术
对于内存中变量的组织⽅式有⼀定的
要求
BBS溢出
格式化串溢出
攻击三部曲
构造需要运⾏的shellcode,并将其
放到⺫标系统的内存
获得缓存区的⼤⼩和定位溢出点RET
的位置
控制程序跳转,改变程序流程
缓冲区溢出攻击
特点
不需要太多的先决条件
杀伤⼒很强
技术性强
破坏性
极其容易使服务停⽌运⾏
隐蔽性
漏洞发现者并⾮编写者
攻击代码很短