为了账号安全,请及时绑定邮箱和手机立即绑定

缓冲区溢出——初学者必须注意的问题

标签:
C++

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


百科链接http://baike.baidu.com/link?url=TsOHEk1TuHmR7tRtNg0FN3bOWW5_AkUz-OJn_6lZBSpIT2qk3rTWoT1I1SmXmU2Uvcm8snHS9d3b001x6fb0w7MSM82PdrqCb4-KRLI7lU8XwjD8rUfYCB8lVmjtf1EzVR2eMhf22dvmRSPgy-CYqK


下面通过一个示例来详细看看什么是缓冲区溢出。程序的缓冲区就像一个个格子,每个格子中存放不同的东西,有的是命令,有的是数据,当程序需要接收用户数据,程序预先为之分配了4个格子(下图1中黄色的0~3号格子)。按照程序设计,就是要求用户输入的数据不超过4个。而用户在输入数据时,假设输入了16个数据,而且程序也没有对用户输入数据的多少进行检查,就往预先分配的格子中存放,这样不仅4个分配的格子被使用了,其后相邻的12个格子中的内容都被新数据覆盖了。这样原来12个格子中的内容就丢失了。这时就出现了缓冲区(0~3号格子)溢出了。
https://img1.sycdn.imooc.com//5b504ea90001fc4706250314.jpg





在上面示例的基础上来看一个代码实例,程序如下:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序有root或者suid执行权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。


我们看一下strcpy的实现


////C语言标准库函数strcpy的一种典型的工业级的最简实现。//返回值:目标串的地址。//对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。//参数:des为目标字符串,source为原字符串。char* strcpy(char* des,const char* source) { char* r=des;assert((des != NULL) && (source != NULL)); while((*des++ = *source++)!='\0'); return r; } //while((*des++=*source++));的解释:赋值表达式返回左操作数,所以在赋值'\0'后,循环停止。


也就是说,字符串结束符'\0'也会赋值给des的指向


如果我们做这样的操作:

char *str1="0123456789";

char string[10];

strcpy(string,str1);

那么其实我们就会给string[11]赋值一个'\0',

由于此类操作不影响string字符数组的本质,编译也不会报错。所以我们需要格外注意。

否则后果不堪设想~



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消