一、缓冲区基本概念
- 缓冲区:缓冲区也称为堆栈,是一种抽象的数据结构,物理上是一段连续分配的内存空间。
- 堆(heap):堆是程序申请并释放的内存空间(线程共享的内存空间)
- 栈(stack):栈是操作系统自动分配的内存空间(线程独有内存空间)
- 两个特点:
- “后进先出”原则:数据操作(入栈“push”和出栈“pop”)遵循“后进先出”原则;
示例:羽毛球放进球盒,后放进球盒的先拿出来。 - 栈是从内存的高地址向低地址增长的,堆向高地址方向生长;
- “后进先出”原则:数据操作(入栈“push”和出栈“pop”)遵循“后进先出”原则;
- 指针
- 指针是指向内存单元的地址
- 寄存器
- 暂存指令、数据和位址
- ESP(栈顶)
- EBP(栈底)
- EIP(返回地址)
二、缓冲区溢出攻击基本概念
- 缓冲区溢出原理:
- 攻击者利用编写不够严谨的程序,通过向程序的缓冲区写入超过预定长度的数据,造成缓存的溢出,从而破坏程序的堆栈,导致程序执行流程的改变;
- 缓冲区溢出的危害
- 最大数量的漏洞类型
- 漏洞危害等级高
缓冲区溢出简单示例:
首先我们定义一个程序,将用户输入的内容(仅限8位字符)打印在屏幕上
#include <stdio.h>
int main ( )
{
char name[8];
printf("Please input your name: ");
gets(name);
printf("you name is: %s!", name);
return 0;
}
然后进行运行:
- 当用户输入内容在8位以内时,程序正常执行
- 用户输入内容超过8位以后,程序执行产生错误
- 正常状态堆栈与异常对比
- 缓冲区溢出攻击过程
- 如果可以精确控制内存跳转地址,就可以执行指定代码,获得权限或破坏系统
- 缓冲区溢出的防范
- 用户层面
- 安装漏洞补丁
- 部署防火墙
- 开发人员层面
- 编写安全代码,对输入数据进行验证
- 使用相对安全的函数
- 系统
- 缓冲区不可执行技术
- 虚拟化技术
- 用户层面
- 典型病毒:蠕虫病毒:
- 1988年11月莫里斯蠕虫事件
- 2017年4月14日席卷全球的“永恒之蓝”蠕虫病毒