【课】缓冲区溢出与防护

缓冲区溢出与防护


初识缓冲区溢出

缓冲区溢出事件

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。
更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
大部分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
      扩展堆栈指针,指向栈顶

缓冲区溢出过程

一个代码案例,上传图片时补上

缓冲区溢出防范

  • 攻击目标
    1. 利用溢出覆盖程序的其他存储单元,造成被攻击的服务拒绝
    2. 利用远程服务的溢出漏洞,远程获得目标的控制权,提升权限。
  • 溢出条件
    1.在被攻击程序的地址空间安放shellcode
    2.通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
  • 防范
    • 在程序设计过程中
      1. 对于软件开发者:使用安全的函数
        用fgets()代替gets()
        用strncpy()代替strcpy()
        用snprintf()代替sprintf()
      2. 利用编译器的边界检查来实现缓冲区的保护,这个方法使得缓冲区溢出不可能出现,完全消除缓冲区溢出的威胁
    • 个人用户
      1. 关闭不必要的特权程序
      2. 及时给系统和服务程序漏洞打补丁
        3.降低CMD权限
        4.添加服务器WAF类产品
posted @ 2020-05-12 11:21  醉笑天苍  阅读(336)  评论(0)    收藏  举报