大家好,如果您还对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的部分存储在栈帧中不属于它的位置,即覆盖了栈帧上存储的其他信息,则可能会导致程序在其他位置出错,使得问题很难定位。
当然,也有很幸运的时候,那就是超出buff的部分存放在未使用的堆栈空间中。但我们决不能听之任之。
如何避免
对于上面所示的例子,我们可以清楚地看到,要复制的字符串长度大于buff的长度,我们可以选择增加buff的长度。但在实际编程中,我们往往很难检测到缓冲区大小是否会被超出。
例如,对于gets 函数:
char buff[255];gets(buff);我们不知道用户会在控制台输入多少个字符,但可以肯定的是,输入的字符很有可能超过255个,甚至字符中包含可以的字节执行代码编码(当然,编译器和操作系统有很多机制,例如堆栈随机化、堆栈损坏检测、限制可执行代码区域等来对抗缓冲区溢出攻击),这时候就会发生灾难。
因此我们不应该使用像gets这样的不安全函数,而应该选择像fgets这样的替代函数。查看gets函数的手册,发现手册甚至直白地说:永远不要使用gets()。
同样,库中的一些函数也可能导致缓冲区溢出。我们应该尽量避免使用它们并选择使用更安全的版本。
推荐函数的特点是限制了操作内容的大小,从而避免了缓冲区溢出。当然,它也可能带来另一个问题,那就是截断。
我们修改一下之前的程序:
#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 可以看到,虽然部分字符串没有被复制,但是避免了缓冲区溢出,程序不再异常终止。
总结
缓冲区溢出造成的危害非常严重,可能会导致程序终止或者程序运行异常,导致问题定位困难。当然,有时候,它可以正常运行,但我们不能冒险。因此,在实际编程中,尽量选择比较安全的函数,避免缓冲区溢出。有时不一定有更安全的功能可以替代。在这种情况下,我们需要特别注意自己。
思考
下面的代码有什么问题:
char buff[10];strcpy(buff,’0123456789′);
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/166622.html
用户评论
我就是这样一个人
刚学C语言就被这个缓冲区溢出的问题恶心坏了,看了你的文章感觉好点了!原来是这样子的原理啊,要好好注意边界检测了,感谢分享!
有19位网友表示赞同!
我的黑色迷你裙
C语言真的太危险了!这种缓冲区溢出漏洞简直可怕,想想以前自己写代码的时候没有意识到这个问题,现在看明白赶紧修复一遍程序。感谢提醒!
有6位网友表示赞同!
无望的后半生
终于明白了什么叫做缓冲区溢出!这篇文章写的很详细,图文并茂的讲解,让我更容易理解这个概念。以后编程要格外小心了,尤其要注意数据的长度限制!
有8位网友表示赞同!
玻璃渣子
讲道理,缓冲区溢出这种问题真的很古老了,还是没少被绕过啊… 学习C语言的朋友们一定要了解这篇指南哦, 避免给自己挖坑!学习安全编程也是很有必要的。
有5位网友表示赞同!
心悸╰つ
文章写的不错,把核心概念点明了,加上实例说明很容易理解。作为一个初学C语言的菜鸟,这份文能让我少走很多弯路,真是太感谢啦!
有9位网友表示赞同!
微信名字
缓冲区溢出的问题确实让人头疼,感觉每次遇到都像是在玩俄罗斯套娃一样,层层嵌套的防御机制最终还是会被绕过。希望后续的文章能分享一些针对不同场景的防范方法!
有15位网友表示赞同!
煮酒
这篇文章其实还蛮浅层的,缓冲区溢出这种类型的漏洞有很多种,很多文章只讲表面功夫,很少深入探讨它的原理和攻击手段。希望能看到更深入的分析呢!
有16位网友表示赞同!
嘲笑!
以前没学过C语言一直很好奇这缓冲区溢出的说法是什么… 看完这篇指南终于明白啦!原来是这么个原理啊,不过幸好有各种防护措施可以避免这种情况发生!
有5位网友表示赞同!
病房
我也是C语言新手,刚开始学习的时候就遇到这个缓冲区溢出问题,当时真的一头雾水。看了这篇文章感觉豁然开朗,现在知道这个漏洞是如何发生的,以及如何预防了!
有19位网友表示赞同!
温柔腔
文章写的不错,内容也很全面,把缓冲区溢出问题的原理、危害和防范措施都介绍得很清楚。作为一个想深入学习C语言安全编程的人来说,这篇文很有指导意义!
有15位网友表示赞同!
念初
我觉得这篇文章的标题有点过于笼统了,应该更加具体一些,比如“C++中常见的缓冲区溢出漏洞分析”。这样更能抓住读者的注意力,吸引他们点击阅读。
有11位网友表示赞同!
在哪跌倒こ就在哪躺下
总觉得文章缺乏实例讲解,只有理论知识是不够的。如果加入一些具体的代码示例和攻击场景模拟的话,会更容易让人理解和记忆!
有9位网友表示赞同!
。婞褔vīp
文章中写的挺好,特别是针对C语言新手写的解释很详细,让我容易明白缓冲区溢出是怎么回事。希望作者以后能多更新一些关于安全编程的文章,对我们学习非常有帮助!
有20位网友表示赞同!
一纸愁肠。
这篇文章其实很有用,但是对于已经掌握C语言原理的人来说内容比较基础了。我希望作者能深入一点,探讨一下更复杂的漏洞攻击场景和防御策略!
有14位网友表示赞同!
发型不乱一切好办
缓冲区溢出确实是一个古老的问题,但由于缺乏安全性概念的意识,很多程序员对此还是不够重视,导致今でも在各种软件中出现。希望这个指南能够提醒大家注重代码的安全设计!
有16位网友表示赞同!