首页 > 运维 > linux运维 > 正文

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

爱谁谁
发布: 2025-07-12 09:18:27
原创
722人浏览过

大家好,很高兴再次与你们见面,我是你们的朋友全栈君。

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

缓冲区溢出是一种非常普遍且危险的漏洞,广泛存在于各种操作系统和应用软件中。利用缓冲区溢出攻击,可以导致程序运行失败、系统崩溃或重新启动等后果。更严重的是,通过这种攻击可以执行非授权指令,甚至获取系统特权,进行各种非法操作。

缓冲区溢出攻击有多个英文名称,包括buffer overflow、buffer overrun、smash the stack、trash the stack、scribble the stack、mangle the stack、memory leak、overrun screw,这些名称都指的是同一种攻击手段。第一个缓冲区溢出攻击——Morris蠕虫,发生在1988年,由罗伯特·莫里斯(Robert Morris)制造,导致全球6000多台网络服务器瘫痪。

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

计算机程序通常会使用一些内存,这些内存可能是程序内部使用的,也可能是存放用户输入数据的,通常称为缓冲区。溢出指的是当数据超出容器容量时溢出,在计算机程序中,就是数据使用了分配内存空间之外的内存空间。缓冲区溢出简单来说,就是计算机在接收输入数据时未进行有效检测(理想情况下,程序会检查数据长度,不允许输入超过缓冲区长度的字符),导致数据填充超过缓冲区容量,溢出到分配空间之外的内存空间,覆盖其他内存空间的数据。

通过向程序的缓冲区写入超过其长度的内容,例如定义一个字符串变量,只允许存储最多15个字符(IP地址的最大字符数),但用户误操作输入了超过15个字符,且程序本身没有校验用户输入的字符数量,直接存储到该变量的内存地址空间,导致缓冲区溢出,破坏程序的堆栈,造成程序崩溃或执行其他指令,达到攻击目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

二、缓冲区溢出漏洞攻击方式

缓冲区溢出漏洞可以让任何掌握黑客技术的人获得机器控制权甚至最高权限。通常利用缓冲区溢出漏洞攻击root程序,通过执行类似“exec(sh)”的代码来获得root的shell。黑客通常需要完成两个任务:在程序的地址空间中安排适当的代码,以及通过初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。

1)在程序的地址空间里安排适当的代码

在程序的地址空间中安排适当的代码通常相对简单。如果攻击的代码已经存在于被攻击的程序中,只需传递一些参数,然后使程序跳转到目标即可。例如,要求执行“exec(‘/bin/sh’)”,而在libc库中存在执行“exec(arg)”的代码,其中“arg”是一个指向字符串的指针参数,只需修改传入的参数指针指向“/bin/sh”,然后跳转到libc库中的相应指令序列即可。当然,这种可能性较小,通常需要使用“植入法”。

当向要攻击的程序输入一个字符串时,程序会将该字符串放入缓冲区,字符串包含的数据是可以在目标硬件平台上运行的指令序列。缓冲区可以位于堆栈(自动变量)、堆(动态分配的内存)或静态数据区(初始化或未初始化的数据)等任何地方。也可以不溢出任何缓冲区,只要找到足够的空间放置这些攻击代码即可。

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

2)控制程序转移到攻击代码的形式

缓冲区溢出漏洞攻击的目标是改变程序的执行流程,使其跳转到攻击代码。最基本的方法是溢出一个未经检查或存在其他漏洞的缓冲区,这样会扰乱程序的正常执行顺序。通过溢出某缓冲区,可以改写相邻程序空间,直接跳过系统的身份验证。原则上,攻击时针对的缓冲区溢出程序空间可以是任意空间,但由于不同位置的定位不同,带来了多种转移方式。

(1)函数指针(Function Pointers)

在程序中,“void (*foo)()”声明了一个返回值为“void”的函数指针变量“foo”。函数指针可以用来定位任意地址空间,攻击时只需在任意空间中的函数指针附近找到一个可溢出的缓冲区,然后用溢出来改变函数指针。当程序通过函数指针调用函数时,程序流程就会实现。

(2)激活记录(Activation Records)

当一个函数调用发生时,堆栈中会留有一个激活记录,包含函数结束时返回的地址。通过溢出这些自动变量,使返回地址指向攻击代码,再通过改变程序的返回地址。当函数调用结束时,程序会跳转到事先设定的地址,而不是原来的地址。这种溢出方式也较为常见。

(3)植入综合代码和流程控制

常见的溢出缓冲区攻击类是在一个字符串中综合了代码植入和激活记录。攻击时定位在一个可溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变激活记录的同时植入代码(因为C语言习惯上只为用户和参数开辟很小的缓冲区)。植入代码和缓冲区溢出不一定要一次性完成,可以在一个缓冲区内放置代码(此时不溢出缓冲区),然后通过溢出另一个缓冲区来转移程序的指针。这种方法通常用于可溢出的缓冲区不能放入全部代码时。如果想使用已经驻留的代码而不需要外部植入,通常必须先将代码作为参数。在libc库中的一部分代码段会执行“exec(something)”,其中“something”是参数,使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定代码段。

程序编写的错误导致网络的不安全性也应受到重视,因为缓冲区溢出已充分表现了这种不安全性。

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

三、缓冲区溢出攻击的防范策略

缓冲区溢出攻击的防范与整个系统的安全性密切相关。如果整个网络系统的安全设计很差,则遭受缓冲区溢出攻击的风险会大大增加。针对缓冲区溢出,可以采取多种防范策略。

(1)系统管理上的防范策略

首先要关闭不需要的特权程序。

其次要及时为程序漏洞打补丁。

(2)软件开发过程中的防范策略

缓冲区溢出的主要原因包括:数组没有边界检查导致的缓冲区溢出;函数返回地址或函数指针被改变,使程序流程改变成为可能;植入代码被成功执行等。因此,从技术上可以采取以下措施。

1)强制编写正确的代码。

在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲区中的数据不越界且有效,就可以避免缓冲区溢出,更不可能使程序跳转到恶意代码上。

2)通过操作系统使缓冲区不可执行,从而阻止攻击者植入攻击代码。

通过使被攻击程序的数据段地址空间不可执行,可以防止攻击者执行植入被攻击程序输入缓冲区的代码,这种技术称为缓冲区不可执行技术。

3)改进C语言函数库。

C语言中存在缓冲区溢出攻击隐患的系统函数有很多,例如gets()、sprintf()、strcpy()、strcat()、fscanf()、scanf()、vsprintf()等。可以开发出更安全的封装了若干已知易受堆栈溢出攻击的函数。

4)使堆栈向高地址方向增长。

当使用的机器堆栈压入数据时向高地址方向前进,无论缓冲区如何溢出,都不可能覆盖低地址处的函数返回地址指针,从而避免了缓冲区溢出攻击。但这种方法仍然无法防范利用堆和静态数据段的缓冲区进行溢出的攻击。

5)在程序指针失效前进行完整性检查。

原理是在每次程序指针被引用之前先检测该指针是否已被恶意改动,如果发现被改动,程序就拒绝执行。

6)利用编译器将静态数据段中的函数地址指针存放地址和其他数据的存放地址分离。

如果你想更好地提升你的编程能力,学好C语言和C++编程!弯道超车,快人一步!【C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程),欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍:

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

编程学习视频:

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/d63cc273ce120d9294c13a73a8aac01a

以上就是划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号