C语言坑点指南缓冲区溢出

前言缓冲区溢出通常指的是向缓冲区写入了超过缓冲区所能保存的最大数据量的数据。如果说之前所提到的一些问题可能只是影响部分功能的实现,那么缓冲区溢出将可能会造成程序

大家好,如果您还对C语言坑点指南缓冲区溢出不太了解,没有关系,今天就由本站为大家分享C语言坑点指南缓冲区溢出的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

缓冲区溢出的示例

对于以下程序:

#include stdio.h#include string.hint main(void){ char buff[8]={0};字符*p=’0123456789′; strcpy(buff,p); printf(‘%s\n’,buff ); return 0;} 定义一个数组长度为8的字符数组buff,使用strcpy函数将p指向的字符串常量复制到buff中。

运行程序,结果如下:

0123456789*** 检测到堆栈粉碎***:/buff 终止已被放弃(核心已被转储)。可以看出,由于p指向的字符串长度大于buff的长度,因此在复制时由于缓冲区溢出而导致栈被破坏。程序中的内容,导致程序异常终止。

事实上,有时幸运的是,缓冲区溢出导致程序立即出错,因为我们至少知道出了问题。不幸的是,如果超出buff的部分存储在栈帧中不属于它的位置,即覆盖了栈帧上存储的其他信息,则可能会导致程序在其他位置出错,使得问题很难定位。

C语言坑点指南缓冲区溢出

当然,也有很幸运的时候,那就是超出buff的部分存放在未使用的堆栈空间中。但我们决不能听之任之。

如何避免

对于上面所示的例子,我们可以清楚地看到,要复制的字符串长度大于buff的长度,我们可以选择增加buff的长度。但在实际编程中,我们往往很难检测到缓冲区大小是否会被超出。

例如,对于gets 函数:

char buff[255];gets(buff);我们不知道用户会在控制台输入多少个字符,但可以肯定的是,输入的字符很有可能超过255个,甚至字符中包含可以的字节执行代码编码(当然,编译器和操作系统有很多机制,例如堆栈随机化、堆栈损坏检测、限制可执行代码区域等来对抗缓冲区溢出攻击),这时候就会发生灾难。

因此我们不应该使用像gets这样的不安全函数,而应该选择像fgets这样的替代函数。查看gets函数的手册,发现手册甚至直白地说:永远不要使用gets()。

C语言坑点指南缓冲区溢出

同样,库中的一些函数也可能导致缓冲区溢出。我们应该尽量避免使用它们并选择使用更安全的版本。

推荐函数的特点是限制了操作内容的大小,从而避免了缓冲区溢出。当然,它也可能带来另一个问题,那就是截断。

我们修改一下之前的程序:

#include stdio.h#include string.hint main(void){ char buff[8]={0};字符*p=’01234567890123′; strncpy(buff,p,sizeof(buff)); printf(‘%s \n’,buff); return 0;}运行结果如下:

01234567 可以看到,虽然部分字符串没有被复制,但是避免了缓冲区溢出,程序不再异常终止。

总结

C语言坑点指南缓冲区溢出

缓冲区溢出造成的危害非常严重,可能会导致程序终止或者程序运行异常,导致问题定位困难。当然,有时候,它可以正常运行,但我们不能冒险。因此,在实际编程中,尽量选择比较安全的函数,避免缓冲区溢出。有时不一定有更安全的功能可以替代。在这种情况下,我们需要特别注意自己。

思考

下面的代码有什么问题:

char buff[10];strcpy(buff,’0123456789′);

用户评论

C语言坑点指南缓冲区溢出
我就是这样一个人

刚学C语言就被这个缓冲区溢出的问题恶心坏了,看了你的文章感觉好点了!原来是这样子的原理啊,要好好注意边界检测了,感谢分享!

    有19位网友表示赞同!

C语言坑点指南缓冲区溢出
我的黑色迷你裙

C语言真的太危险了!这种缓冲区溢出漏洞简直可怕,想想以前自己写代码的时候没有意识到这个问题,现在看明白赶紧修复一遍程序。感谢提醒!

    有6位网友表示赞同!

C语言坑点指南缓冲区溢出
无望的后半生

终于明白了什么叫做缓冲区溢出!这篇文章写的很详细,图文并茂的讲解,让我更容易理解这个概念。以后编程要格外小心了,尤其要注意数据的长度限制!

    有8位网友表示赞同!

C语言坑点指南缓冲区溢出
玻璃渣子

讲道理,缓冲区溢出这种问题真的很古老了,还是没少被绕过啊… 学习C语言的朋友们一定要了解这篇指南哦, 避免给自己挖坑!学习安全编程也是很有必要的。

    有5位网友表示赞同!

C语言坑点指南缓冲区溢出
心悸╰つ

文章写的不错,把核心概念点明了,加上实例说明很容易理解。作为一个初学C语言的菜鸟,这份文能让我少走很多弯路,真是太感谢啦!

    有9位网友表示赞同!

C语言坑点指南缓冲区溢出
微信名字

缓冲区溢出的问题确实让人头疼,感觉每次遇到都像是在玩俄罗斯套娃一样,层层嵌套的防御机制最终还是会被绕过。希望后续的文章能分享一些针对不同场景的防范方法!

    有15位网友表示赞同!

C语言坑点指南缓冲区溢出
煮酒

这篇文章其实还蛮浅层的,缓冲区溢出这种类型的漏洞有很多种,很多文章只讲表面功夫,很少深入探讨它的原理和攻击手段。希望能看到更深入的分析呢!

    有16位网友表示赞同!

C语言坑点指南缓冲区溢出
嘲笑!

以前没学过C语言一直很好奇这缓冲区溢出的说法是什么… 看完这篇指南终于明白啦!原来是这么个原理啊,不过幸好有各种防护措施可以避免这种情况发生!

    有5位网友表示赞同!

C语言坑点指南缓冲区溢出
病房

我也是C语言新手,刚开始学习的时候就遇到这个缓冲区溢出问题,当时真的一头雾水。看了这篇文章感觉豁然开朗,现在知道这个漏洞是如何发生的,以及如何预防了!

    有19位网友表示赞同!

C语言坑点指南缓冲区溢出
温柔腔

文章写的不错,内容也很全面,把缓冲区溢出问题的原理、危害和防范措施都介绍得很清楚。作为一个想深入学习C语言安全编程的人来说,这篇文很有指导意义!

    有15位网友表示赞同!

C语言坑点指南缓冲区溢出
念初

我觉得这篇文章的标题有点过于笼统了,应该更加具体一些,比如“C++中常见的缓冲区溢出漏洞分析”。这样更能抓住读者的注意力,吸引他们点击阅读。

    有11位网友表示赞同!

C语言坑点指南缓冲区溢出
在哪跌倒こ就在哪躺下

总觉得文章缺乏实例讲解,只有理论知识是不够的。如果加入一些具体的代码示例和攻击场景模拟的话,会更容易让人理解和记忆!

    有9位网友表示赞同!

C语言坑点指南缓冲区溢出
。婞褔vīp

文章中写的挺好,特别是针对C语言新手写的解释很详细,让我容易明白缓冲区溢出是怎么回事。希望作者以后能多更新一些关于安全编程的文章,对我们学习非常有帮助!

    有20位网友表示赞同!

C语言坑点指南缓冲区溢出
一纸愁肠。

这篇文章其实很有用,但是对于已经掌握C语言原理的人来说内容比较基础了。我希望作者能深入一点,探讨一下更复杂的漏洞攻击场景和防御策略!

    有14位网友表示赞同!

C语言坑点指南缓冲区溢出
发型不乱一切好办

缓冲区溢出确实是一个古老的问题,但由于缺乏安全性概念的意识,很多程序员对此还是不够重视,导致今でも在各种软件中出现。希望这个指南能够提醒大家注重代码的安全设计!

    有16位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/166622.html

(0)
小su's avatar小su
上一篇 2024年9月21日 下午1:39
下一篇 2024年9月21日 下午1:53

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注