整数溢出实例与防范

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

溢出——实例与防范Q1:什么是整数溢出?③整数溢出将导致“不确定性行为”。比如完全忽略该溢出或终止进程。大多数编译器都会忽略这种溢出,这可能会导致不确定或错误的值保存在了整数变量中。①计算机中整数都有一个宽度(例如win7下VC6编译器中int类型为32位)。②当试图保存一个比它可以表示的最大值还大的数时,就会发生整数溢出。常见整型的表示范围:一般超出范围会进行“回环操作”,就像时钟一样。我们在VC6环境下测试a+b(a和b均为无符号短整型):Q2:整数溢出的危害有哪些?①导致无法预知的程序错误,甚至很难测试出程序的这个BUG。e.g.intm1,m2,m_max;cinm1m2m_max;if(m1+m2max)cout“m1+m2大”endl;elsecout“m1+m2小”endl;Q2:整数溢出的危害有哪些?②如果作为数组下标使用,溢出时会导致无法预知的结果。e.g.charp[10000];intn;scanf(“%d”,&n);if(n10000)p[n]=‘a’;………Q3:整数溢出漏洞如何利用?整数溢出不同于一般的常见的bug,它不允许直接改写内存或直接控制程序流程,但它更难以捕获。在某些特殊的情况下,可以利用该漏洞进行额外内存分配,或者做缓冲区溢出攻击。接下来给出一个利用整数溢出,做程序流程控制的示例:整数溢出漏洞利用示例voidfuc()//打开记事本{ShellExecute(NULL,open,notepad,NULL,NULL,SW_SHOW);}voidfuc1()//打开计算器{ShellExecute(NULL,open,calc,NULL,NULL,SW_SHOW);}#defineMAX_INFO32767void(*fuc_ptr)()=fuc1;charinfo[MAX_INFO];charinfo1[30000];charinfo2[30000];freopen(input.txt,r,stdin);cin.getline(info1,30000,'');cin.getline(info2,30000,'');shortlen1=strlen(info1);shortlen2=strlen(info2);shortall_len=len1+len2;if(all_lenMAX_INFO){strcpy(info,info1);strcat(info,info2);}fuc_ptr();整数溢出漏洞利用示例整数溢出漏洞利用示例由于整数溢出漏洞被利用,导致缓冲区溢出,进而函数指针的值被覆盖,导致原本应该调用的计算器,变成了记事本。Q4:整数溢出漏洞如何防范?整数溢出漏洞很大程度上,是因为程序员不好的变成习惯和疏忽。①形成关于特殊数据输入的意识,比如之前先确定最大和最小输入,使用合适的数据类型。②尽量避免对两个正数相加之后,再取结果比较,上例应该改成:if(MAX_INFO-len1len2)……③在使用变量申请内存,或者作为数组下标时,注意对越界的监测。ThankYou!

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功