缓冲区溢出与防护

目录

一、初识缓冲区溢出

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类产品。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值