下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关 成为隐患;另外,数组越界问题、字符串格式化问题,都是需考虑的问题型的多个实例。举例说明,如下代码voidvoidfunction(char{charbuffer[16];}这是一个Csc(),该函数的功能是将中的内容c到ff中在该代码中,r数据类型相同), 动 动态PUSH:在堆栈的顶部加入一个元素,栈顶上移O下移。函数调用函数的现场,函数中又的现场,再恢复、、一个名为堆栈指针(SP)的寄存器指向堆栈的堆栈的大小在运行时由内核动态地调CPU使用指令PUSH和POP来向堆栈中添加元素和中移去 函数局部变量等。观察如下例子voidvoidfunction(inta,int{}void{}令,将源代码编译并生成汇编代码输出_mainproc;?debugL5movax,2pushaxmovax,1pushaxcallnearptr 英文名称,如bufferoverflow、bufferoverrun、smashthestack、trashthestack等等,它也是一种比较有历史的、多、多
作系果包
是Morris蠕致的程系: 程系: voidvoidfunction(char{charbuffer[16];}tp()inputpbuffinput,就会造成buffr。我们可以假设最理想的情况是:程序对输入字符串长行检查,确保输入的长度不超过缓冲区 存在象strcpyscanf();等等。具体大家可以参考相应文档下面用一个程序来介绍缓冲区溢出的具#include#include#includevoidfunction(char{charbuffer[10];}intmain(intargc,char*{return}在Turboc2下面生成exe文件:P02_02.exe,到达该文件存放 ,在因为function函数中的buffer大小定义为10,在输入参数没有超过10个字的情况下,程序没有问本章是基于CC语言具有不安全性的某些特性,。在这个程序中, 程序执行发生不正常现象。从的角度讲,因为这种事情完全是“碰巧”,等到人员去维护时,问题就找不到了,白白花费人员的精缓冲区溢出程序是否试 溢出时被覆盖的数据;等的目的站在量的下面用一个例子来介绍缓冲 的原理。所使用的环境 5 f 5 f u
#include<string.h>voidfun1(char*input){charprintf("Call}intmain(intargc,char{return}由该代码生成exe文件(具体和相应的IDE有关),在结果(下面分析以下错 )的ASCII码 46#include<stdio.h>#include<string.h>voidfun1(char*input){charbuffer[10];printf("Call}void{printf("Call}intmain(intargc,char{printf("AddressOfreturn}生成,运行如下命令此处我们可以知道,u2报错:址
#include#include 3,voidfun1(char 3,{char printf("Call}void{printf("Call}intmain(intargc,char{printf("AddressOffun2=%p\n",fun2);return0;}注意!fun2函数被调用了在中文in、07ff52,可以用sdesd以下sd"\x77\x1d\x80\x7c""\x52\x8D\x45\xF4\x50\xFF\x55\xF0"F\x8D\x45\xF4""\x50\xB8""\xc7\x93\xbf\x77""\xFF\xD0"#include<stdio.h>#include<string.h>voidfun1(char*input){charbuffer[10];}intmain(intargc,char{charbuffer[]="abcdefghijklmnopqrstuvwxyz12\x12\x45\xfa\x7f""\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA""\x77\x1d\x80\x7c"45\xF4""\x50\xB8""\xc7\x93\xbf\x77""\xFF\xD0""\x83\xC4\x12\x5D";return}生成,运行相应exe运行时,能够打开控制台命令如 限,可以进行任意操 看以下#include<stdio.h>#include<string.h>#includemain(intargc,char{char*buffer1,*charstr[]=buffer1=(char*)malloc(32);buffer2=(char*)malloc memcpy(buffer1,str,32+6);free(buffer1);free(buffer2);return0;}生成exe文件效果 者如果精心构造这个6个字节,也可以达 的的缓冲区溢 ,由于实现起来比较方便,成为一种常见的安。因此,相对于其 ,缓冲区溢 比较普 者可以通过很多利用缓冲区溢出并且进行。一般说来,缓冲区溢出的目的在于使得者取得某些程序的控制权,执行某些功能,实现操作的目的;情况下,如果该程序具有管理者为了达到目的,一般情况下 行为分为两步行 直接输入法。者向被个指令序列,的地址传递参数法。在这种情况下,者想要执 码要求执行exec(“某个命令”),而在被 函数为exec(arg),那么 怎样让程序跳转到相应的程序代码,一般情况下有如法束时返回的地址,指示函数结束后会执行的功能。代码击者只需在函数指针附近将缓冲区溢出,用一个目的具体案例:本世纪初,Cerberus安全小组发布了微软的IIS4/5存在 浏览器向IIS提出一个HTTP请求, (或IP地址)后,加上一个件名,该文件名以“.htr”做后ServiceAPI)应用程序;IIS将所有针对“.htr”资源的请求定向到ISM.DLL程序,ISM.DLL这个文件并执行浏览器将提交的请求中包含的文件名在缓冲区中,若它很长,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS。更进一步,在 利用CompaqC编译器等。 :成一习不因为一味追程序编写些安隐多的码,别是不要使用一些能有 P少 发生的可可以一错工,限一能具缓溢出 的函数的用如tcp和t等)使一个 成功地变了程的针,为系统事检测到指的改变这个指将会被使达不到 的的整数 方以int为例,在TurboC中,一个整数用2个字节(16位)存放;在某些C编译器(如DevC++)中,整数用4个字节(32位)存放;在Java语言中,一个字节存放的字节整数短整数长整数in编码方101102212进制和 16进制表示 加1,成为:16进制表示为:0xFFFFFFFE一般说来,如果 置1,这个变量就被解释为负数;如果置0,这个变就解 什么情况下会出现整数溢出呢一数num1=num2= num3=num1+由于整数在内存里面保存在一个固定长度(在本章中使用32位)的空间内一数num1=num2= num3=num1+整举个例,有两个无符号整数,u1n,个数是32首值n1一32位整的大,num2被赋值为。后让um和u2加,后 结果第33位整um代如:很显然,num1的值是;num2的值;两者相因此,num3中的值是0,发生了整数溢出试#include试int{储int {short能char来l=来大sc=明printf("l=0x%x(%dbytes)\n",l, printf("s=0x%x(%dbytes)\n",s,可printf("c=0x%x(%dbytes)\n"creturn}生成可执行文件,运行,显示#include<stdio.h>#include<string.h> 不。int 不。{般unsignedshort般int以char以i=法s=法if(s>= return-}memcpy(buf,argv[2buf[i]=下printf("成功拷贝%d个字节\nreturn}然后这个值被赋予unndhot类型的整数,由于位进 ,16位能 的最大数是即:十进制的65535,因此,unsignedshort 的范围是0–65535,如果这个值大于unsignedshort类型所能够 1系统只取后面16位进行。下面的例子列举了另#includeintmain(intargc,char{intn1=intn2=0x intn6=0x8fffffff;printf("%d(0x%x)+1=%d(0x%x)\n",n1,n1,n1+1,n1+1);printf("%d(0x%x)+%d(0x%x)=%d(0x%x)\n",n2,n2,n2,n2,n2+n2,printf("%d(0x%x)*4=%d(0x%x)\n",n2,n2,n2*4,n2*4);printf("%d(0x%x)-%d(0x%x)=%d(0x%x)\n",n2,n2,n6,n6,n2-n6,n2-return}整数溢出还有可能在动态分配内存时被利用。请看代码P02_11.c该代码将array拷贝到newarray中,生成exe文件,运行看似没有问题。但是如果输入下 令我们知道,1073741824的16进制是 ,从前一个例子可看出 *4=0x0。因此,屏幕上显示很显然,这个看起来没有问题的函数,可能出现在没有为nw分配内存况向里面拷贝组元环次数还非多重时造成系统 。 者通过选择一个合适的值给n可使得循环复执行导致缓冲溢出#include#include<stdio.h>int*arraycpy(int*array,intlen)newarray=if(newarray==NULL)return- for(i=0;i<len;i++)newarray[i]=}return}intmain(intargc,char*argv[]){intarray[]={1,2,3,4,5};return0;}还有一种情况,通过改写m的控制结,也能够在正常的函数运行的过程中插入其他可执行 代码。请看P02_12.c该例子看起来无懈可击,并且进行了len1和len2相加之后的检查,2147483647的16进制为0x7FFFFFFF。该运行结果为程 。根本不会显示:"超出mybuf容纳范围!"。是什么原因?大家自#include#include<stdio.h>intcatstring(char*buf1,char*buf2,intlen1,int{charmybuf[256];if((len1+len2)>256){return-}memcpy(mybuf+len1,buf2, return}intmain(intargc,char*argv[])return} 充分考虑各种数据的取值范围,使用合适的数据类型尽量不要在不同范围的数据类型之间进行赋值;等voidInsertInt(intindex,int{Array[index]=}intmain(intargc,char*argv[])intindex=atoi(argv[1]);intvalue=atoi(argv[2]);return0;}相当于在Array基址后偏移600个整数元素空间字符串格式化不当,也可能造成,其方法和缓冲这种的函数有printf函数、sprintf函数等等。不过一般说来,这种可以很容易避免printf("%s",此种是怎样出现的呢?下面举一个例子。如:打印输printf("%s",则会出现安全隐患,在不知不觉中打开了一个安pipid的参数值就从堆栈中取出,并取代所在的为止。很明显,者可以通过打印出堆栈中的这些值来偷看程序或是向运行中程序的内存里写入任意值#include#includeintmain(intargc,char{return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024高中语文第二单元置身诗境缘景明情梦游天姥吟留别训练含解析新人教版选修中国古代诗歌散文欣赏
- 2024高考地理一轮复习第十三单元人类与地理环境的协调发展练习含解析
- 2024高考历史一轮复习方案专题十三近现代中国的先进思想专题综合测验含解析人民版
- 2024高考地理一轮复习第一部分自然地理-重在理解第四章地表形态的塑造第12讲营造地表形态的力量学案新人教版
- DB42-T 2329-2024 固定污染源气态汞采样装置技术要求与检测方法
- 烤漆房紧急预案
- 二零二五年度粮油产品进出口代理合同3篇
- 二零二五年绿色建材认证瓷砖供应商合作协议3篇
- 镁合金成型与应用教学教案
- 北师大版数学八年级上册《平面直角坐标系中三角形面积问题》
- DB33T 2570-2023 营商环境无感监测规范 指标体系
- 上海市2024年中考英语试题及答案
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传海报
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传画册
- 2025年道路运输企业客运驾驶员安全教育培训计划
- 南京工业大学浦江学院《线性代数(理工)》2022-2023学年第一学期期末试卷
- 2024版机床维护保养服务合同3篇
- 《论拒不执行判决、裁定罪“执行能力”之认定》
- 工程融资分红合同范例
- 2024年贵州省公务员录用考试《行测》真题及答案解析
- 2024国家安全员资格考试题库加解析答案
评论
0/150
提交评论