一、缓冲区基本概念

  1. 缓冲区:缓冲区也称为堆栈,是一种抽象的数据结构物理上是一段连续分配的内存空间
    1. 堆(heap):堆是程序申请并释放的内存空间(线程共享的内存空间)
    2. 栈(stack):栈是操作系统自动分配的内存空间(线程独有内存空间)
    3. 两个特点
      1. “后进先出”原则:数据操作(入栈“push”和出栈“pop”)遵循“后进先出”原则
        示例:羽毛球放进球盒,后放进球盒的先拿出来。
      2. 栈是从内存的高地址向低地址增长的,堆向高地址方向生长
  2. 指针
    1. 指针是指向内存单元的地址
  3. 寄存器
    1. 暂存指令、数据和位址
    2. ESP(栈顶)
    3. EBP(栈底)
    4. EIP(返回地址)

二、缓冲区溢出攻击基本概念

  1. 缓冲区溢出原理:
    1. 攻击者利用编写不够严谨的程序,通过向程序的缓冲区写入超过预定长度的数据,造成缓存的溢出,从而破坏程序的堆栈,导致程序执行流程的改变;
  2. 缓冲区溢出的危害
    1. 最大数量的漏洞类型
    2. 漏洞危害等级高
  3. 缓冲区溢出简单示例:

    1. 首先我们定义一个程序,将用户输入的内容(仅限8位字符)打印在屏幕上

      1. #include <stdio.h>
      2. int main ( )
      3. {
      4. char name[8];
      5. printf("Please input your name: ");
      6. gets(name);
      7. printf("you name is: %s!", name);
      8. return 0;
      9. }
    2. 然后进行运行:

      1. 当用户输入内容在8位以内时,程序正常执行
      2. 用户输入内容超过8位以后,程序执行产生错误

image.png

  1. 正常状态堆栈与异常对比

image.png

  1. 缓冲区溢出攻击过程
    1. 如果可以精确控制内存跳转地址,就可以执行指定代码,获得权限或破坏系统

image.png

  1. 缓冲区溢出的防范
    1. 用户层面
      1. 安装漏洞补丁
      2. 部署防火墙
    2. 开发人员层面
      1. 编写安全代码,对输入数据进行验证
      2. 使用相对安全的函数
    3. 系统
      1. 缓冲区不可执行技术
      2. 虚拟化技术
  2. 典型病毒:蠕虫病毒:
    1. 1988年11月莫里斯蠕虫事件
    2. 2017年4月14日席卷全球的“永恒之蓝”蠕虫病毒