【课】缓冲区溢出与防护
缓冲区溢出与防护
初识缓冲区溢出
缓冲区溢出事件
缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。
更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
大部分0day漏洞都是缓冲区溢出漏洞的简化
- 1988年Moriris蠕虫
- 2003年8月冲击波病毒(ms03-026)
- 2004年5月“震荡波”病毒
- 2007年“VanBot”蠕虫
- 2015年 top10 “GHOST幽灵”漏洞
缓冲区溢出概念
- 向一个容量有限的内存空间中存储过量的数据,这时数据也会溢出存储空间。
- 概念
计算机程序的一种可更正性缺陷,向程序缓冲区写入超长内容,覆盖其他空间数据,从而破坏程序堆栈,造成程序崩溃或转而执行其他命令。
缓冲区:
一块连续的计算机内存区域。在在程序运行过程中,程序的调用参数、返回地址及用户输入等数据均需要存放在一个临时空间内,这个临时的存放空间就被称为缓冲区,也就是所说的堆栈段。
在windows内,内存低端存放动态数据区(即堆栈段)高端为静态数据区(数据段),中间为代码段。这种结构为溢出提供了前提。因为堆栈先进后出,往低地址增长,高地址返回。
缓冲区溢出危害
- 过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可能导致系统崩溃
- 覆盖函数返回地址,使得程序跳转并且执行一段恶意代码,比如得到shell,为所欲为
缓冲区溢出攻击与防护
缓冲区溢出原理
- 根本原因:程序中许多函数对用户输入越界不保护。
比如:C语言中,指针和数组越界不保护是根源,C库函数中:strcat(), strcpy()等能提供溢出。- 一方面是用户不好的编程习惯
- 另一方面是攻击者的恶意利用
- 溢出实例代码
- 典型的寄存器
当输入溢出一直覆盖直到EIP返回地址后调转执行shell- EIP
扩展指令指针,用于存放下一条指令的地址 - EBP
扩展基指针,用于指向栈底 - ESP
扩展堆栈指针,指向栈顶
- EIP
缓冲区溢出过程
一个代码案例,上传图片时补上
。
缓冲区溢出防范
- 攻击目标
- 利用溢出覆盖程序的其他存储单元,造成被攻击的服务拒绝
- 利用远程服务的溢出漏洞,远程获得目标的控制权,提升权限。
- 溢出条件
1.在被攻击程序的地址空间安放shellcode
2.通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。 - 防范
- 在程序设计过程中
- 对于软件开发者:使用安全的函数
用fgets()代替gets()
用strncpy()代替strcpy()
用snprintf()代替sprintf() - 利用编译器的边界检查来实现缓冲区的保护,这个方法使得缓冲区溢出不可能出现,完全消除缓冲区溢出的威胁
- 对于软件开发者:使用安全的函数
- 个人用户
- 关闭不必要的特权程序
- 及时给系统和服务程序漏洞打补丁
3.降低CMD权限
4.添加服务器WAF类产品
- 在程序设计过程中

浙公网安备 33010602011771号