谈谈缓冲区的溢出

本文讨论了缓冲区溢出这一常见的程序错误,它可能导致系统安全风险。通过示例代码,解释了如何因未执行边界检查而产生溢出,并分析了不同长度输入对堆栈的影响,强调了防止缓冲区溢出对抵御黑客攻击的重要性。
摘要由CSDN通过智能技术生成

      缓冲区的溢出是我们经常遇到的一种错误情况,同时也是我们万万不能忽略的一种情况,因为它给程序乃至系统安全带来了很大的安全隐患。先给大家展示一段有安全隐患的代码:

 

#include "stdafx.h"
#include"stdlib.h"
void test();
void main(){

	test();
	system("pause");
}
 
void test(){

	char buf[4];
	printf("input:");
	gets(buf);
	puts(buf);
}


       缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据。缓冲区溢出是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生的溢出的数据覆盖在合法数据(数据、下一条指令的指针、函数返回地址等)的情况。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度,但由于大多数程序都会假设数据长度总是与所分配的存储空间相当,进而存在缓冲区安全隐患。

       现在我们回过来看上面所给的代码,由于test()函数没有执行边界检查,最终会导致test()函数存在缓冲区溢出安全漏洞。test()函数的缓冲区最多只能容纳3个字符和一个空字符'\0',所以当输入字符超过4个的时候就会造成缓冲区溢出。该程序的堆栈说明如图(1)所示,buf[4]被存储在test()函数的栈帧里。

                                                   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值