缓冲区溢出与防护

目录

一、初识缓冲区溢出

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类产品。

猜你喜欢

转载自blog.csdn.net/weixin_62707591/article/details/131219244