目录
一、初识缓冲区溢出
1.1 缓冲区溢出概念
1.2 缓存区
1.3 缓存区溢出的危害
1.4 缓存区溢出事件
二、缓存区溢出攻击
2.1 溢出原理
2.2 典型的寄存器
三、缓存区溢出防御
3.1 缓冲区溢出攻击目标
3.2 缓冲区溢出条件
3.3 缓冲区溢出防范
3.3.1 程序设计过程中
3.3.2 个人用户
一、初识缓冲区溢出
1.1 缓冲区溢出概念
缓冲区溢出:计算机程序的一种可更正性缺陷,向程序缓冲区写入超长内容,覆盖其他空间数据,从而破坏程序堆栈,造成程序崩溃或转而执行其他指令。
1.2 缓存区
缓冲区是一块连续的计算机内存区域。在程序运行过程中,程序的调用参数、返回地址及用户输入等数据均需要存放在一个临时空间内,这个临时的存放空间就被称为缓冲区也就是所说的堆栈段。
1.3 缓存区溢出的危害
过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可能导致系统崩溃;
覆盖函数返回地址,使得程序跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
1.4 缓存区溢出事件
- 2003年8月“冲击波”蠕虫病毒(ms03-026)
- 2004年5月“震荡波”蠕虫病毒 (MS04-011)
- 2007年疯狂的蠕虫病毒“VanBot”(ms07-02q)
- 2015 top 10 “GHOST幽灵幽灵” 漏洞
二、缓存区溢出攻击
2.1 溢出原理
根本原因是程序中很多函数对用户的输入越界不保护。比如,C语言中,指针和数组越界不保护是根源,C库函数中:strcat(). strcpy()等能提供溢出。
2.2 典型的寄存器
- EIP:扩展指令指针,用于存放下一条指令的地址,即存放返回地址;
- EBP:扩展基指针,用于指向栈底;
- ESP:扩展堆栈指针,指向栈顶,(数据覆盖存储单元,低地址往高地址走)。
三、缓存区溢出防御
3.1 缓冲区溢出攻击目标
- 利用溢出覆盖程序的其他存储单元,造成被攻击者的服务拒绝
- 利用远程服务的溢出漏洞,远程获得目标的控制权,提升权限
3.2 缓冲区溢出条件
- 在被攻击程序的地址空间安放shellcode
- 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行
3.3 缓冲区溢出防范
3.3.1 程序设计过程中
对于软件开发者,使用安全的函数:
gets() vs fgets( ) strcpy() vs strncpy() sprintf() vs snprintf()
利用编译器的边界检查来实现缓冲区的保护,这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。
3.3.2 个人用户
- 关闭不需要的特权程序;
- 及时给系统和服务程序漏洞打补丁;
- 降低CMD权限;
- 添加服务番WAF类产品。