本文详细分析了缓冲区溢出的原理,描述了网络攻击者利用缓冲区溢出漏洞进行系统攻击的一般过程,最后简单讨论了几种缓冲区溢出的保护方法。
在过去的十年中,以缓冲区溢出为攻击类型的安全漏洞是最为常见的一种形式。更为严重的是,缓冲区溢出漏洞占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。
缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:殖入并且执行攻击代码。被殖入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。本文简单介绍了缓冲区溢出的基本原理和预防办法。
一、缓冲区溢出的概念和原理
缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
example1.c
void func1(char *input) {
char buffer[16];
strcpy(buffer, input);
}
上面的strcpy()将直接吧input中的内容copy到buffer中。这样只要input的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现Segmentation fault 错误,而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其他命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,便可以对系统进行任意操作了。
请注意,如果没有特别说明,下面的内容都假设用户使用的平台为基于Intel x86 CPU的Linux系统。对其他平台来说,本文的概念同样适用,但程序要做相应修改。
二、制造缓冲区溢出
一个程序在内存中通常分为程序段、数据段和堆栈三部分。程序段里放着程序的机器码和只读数据。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置是:
当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。以下面程序为例:
example2.c
void func1(char * input) {
char buffer[16];
strcpy(buffer, input);
}
void main() {
char longstring[256];
int i;
for( i = 0; i < 255; i++)
longstring [i] = 'B';
func1(longstring);
}
当调用函数func1()时,堆栈如下:
不用说,程序执行的结果是"Segmentation fault (core dumped)"或类似的出错信息。因为从buffer开始的256个字节都将被* input的内容'B'覆盖,包括sfp, ret,甚至*input。'B'的16进值为0x41,所以函数的返回地址变成了0x41414141,这超出了程序的地址空间,所以出现段错误。
提示:试试键盘 “← →” 可以实现快速翻页
每日精选
-
2026.11.11省心选值得买放心购 数码好物推荐 - PChome.net
-
购买石头A30 Pro Steam 3.0洗地机,不仅拥有惊喜价格,还支持15天免费试用,拆封使用了可退、用脏用旧了可退,而且免收来回运费。
-
京东发布双11智能眼镜开门红战报,雷鸟创新同时登顶京东智能眼镜与XR设备两大品牌榜榜首,新品雷鸟iO位列光波导眼镜单品第一,雷鸟GT Max位列AR眼镜单品第一。
-
iPhone 18标准版配备6.3英寸1.5K 120Hz屏幕,保留灵动岛与Face ID,搭载2nm工艺A20芯片,内存升级至9GB RAM,电池容量提升,后置4800万像素双摄,价格大概率上涨。
-
OPPO Reno17系列将于11月正式发布,包括Reno17和Reno17 Pro两款新机,继续由宋雨琦代言。标配5000万像素潜望长焦镜头,支持全焦段4K超清实况照片,并将实况照片拍摄时长从3秒延长至6秒。
-
OPPO官宣耳夹开放式耳机OPPO Enco Clip2新增配色「粉黛海」,将于11月正式发布。目前该机型已有晨雾白、高光金、深空灰三款配色在售。
-
苹果向开发者推送iOS 27.3 Beta版,国行苹果智能同步上线。升级后国行iPhone可体验实时翻译、照片消除、写作工具等功能,但需提前下载最多7GB数据包,对128GB机型存储压力明显。
-
华硕a豆14 Air 2026的核心竞争力,是把轻薄、高性能、好屏幕、长续航和AI体验整合到一台便于随身携带的电脑里。双十一大促期间,华硕a豆14 Air 2026在京东华硕自营旗舰店叠加国家补贴和Plus立减优惠之后,最低到手价可以做到6799.15元,质价比更高。
-
荣耀700系列全系升级幅度可观,影像上继承Magic旗舰的影像能力,标准版也配备潜望长焦镜头,同时加入自拍背屏,并会由鞠婧祎代言。
-
REDMI投影仪5 Pro双11特惠中,拥有1000流明CVIA亮度、支持30°侧投搭配ToF实时自调节、支持120Hz高刷+5ms低延迟。
点击查看更多
网友评论