什么叫缓冲区溢出

董新尧 2024-05-19 04:07:18
最佳回答
缓冲区溢出缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: example0.c ----------------------------------------------------------- void function(char *str) { char buffer[16]; strcpy(buffer,str); } -----------------------------------------------------------上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。在c语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈段的。缓冲区溢出是利用堆栈段的溢出的。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置如下:/――――――――\ 内存低端 |程序段| |―――――――――| |数据段| |―――――――――| |堆栈| \―――――――――/内存高端堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(sp)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,push和pop。push是将数据放到栈的顶端,pop是将栈顶的数据取出。在高级语言中,程序函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值是也用到了堆栈。通常对局部变量的引用是通过给出它们对sp的偏移量来实现的。另外还有一个基址指针(fp,在intel芯片中是bp),许多编译器实际上是用它来引用本地变量和参数的。通常,参数的相对fp的偏移是正的,局部变量是负的。当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(ip)中的内容,做为返回地址(ret);第三个放入堆栈的是基址寄存器(fp);然后把当前的栈指针(sp)拷贝到fp,做为新的基地址;最后为本地变量留出一定空间,把sp减去适当的数值。 下面举个例子: example1.c: ------------------------------------------------------------ void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { function(1,2,3); } -----------------------------------------------------------为了理解程序是怎样调用函数function()的,使用-s选项,在linux下,用gcc进行编译,产生汇编代码输出: $ gcc -s -o example1.s example1.c 看看输出文件中调用函数的那部分: pushl $3 pushl $2 pushl $1 call function 这就将3个参数压到堆栈里了,并调用function()。指令call会将指令指针ip压入堆栈。在返回时,ret要用到这个保存的ip。在函数中,第一要做的事是进行一些必要的处理。每个函数都必须有这些过程:pushl %ebp movl %esp,%ebp subl $20,%esp这几条指令将ebp,基址指针放入堆栈。然后将当前sp拷贝到ebp。然后,为本地变量分配空间,并将它们的大小从sp里减掉。由于内存分配是以字为单位的,因此,这里的buffer1用了8字节(2个字,一个字4字节)。buffer2用了12字节(3个字)。所以这里将esp减了20。这样,现在,堆栈看起来应该是这样的。低端内存高端内存 buffer2 buffer1 sfp ret a b c < ------ [ ][ ][ ][ ][ ][ ][ ] 栈顶栈底 缓冲区溢出就是在一个缓冲区里写入过多的数据。那怎样利用呢,看一下下面程序:example2.c ----------------------------------------------------------- void function(char *str) { char buffer[16]; strcpy(buffer,str); } void main() { char large_string[256]; int i; for( i = 0; i < 255; i++) large_string[i] = 'a'; function(large_string); } ------------------------------------------------------------这个程序是一个经典的缓冲区溢出编码错误。函数将一个字符串不经过边界检查,拷贝到另一内存区域。当调用函数function()时,堆栈如下: 低内存端buffer sfp ret *str高内存端 < ------ [ ][ ][ ][ ] 栈顶栈底很明显,程序执行的结果是"segmentation fault (core dumped)"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容'a'覆盖,包括sfp, ret,甚至*str。'a'的十六进值为0x41,所以函数的返回地址变成了0x41414141, 这超出了程序的地址空间,所以出现段错误。可见,缓冲区溢出允许我们改变一个函数的返回地址。通过这种方式,可以改变程序的执行顺序。 20210311
汇率兑换计算器

类似问答
  • 什么叫溢价回购?
    • 2024-05-19 17:05:46
    • 提问者: 未知
    绿票讹诈(greenmail)又译e5a48de588b662616964757a686964616f31333431346461讹诈赎金,直译为绿讹诈函又称:溢价回购,由green(美元的俚称)和blackmail(讹诈函)两个词演绎而来,指的是单个或一组投资者大量购买目标公司的股票。其主要目的是迫使目标公司溢价回购上述股票(进行讹诈)。...
  • 什么叫对冲基金?
    • 2024-05-19 11:43:21
    • 提问者: 未知
    对冲基金经理的成功要素
  • 什么叫做品牌溢价?
    • 2024-05-19 16:08:37
    • 提问者: 未知
    能举几个实例吗?讲通俗点,品牌溢价就是一升水,装在碗里和装在农夫山泉、依云的瓶子里的售价差异。举个零食的例子,下面这款是无印良品门店里售卖的干脆面,售价3元。净含量30g。...
  • 什么叫冲击系数
    • 2024-05-19 10:08:40
    • 提问者: 未知
    起重机或起重小车运行时,由于路面凸凹不平、轨道街头间隙或高低错位,会使运行的质量在铅垂方向产生冲击作用。因此,应将自重载荷和起升载荷乘以大于1的系数以考虑这种垂向冲击作用,这个系数就称为运行冲击系数。
  • tr**-hcl和pbs缓冲液的区别和用途是什么?
    • 2024-05-19 14:51:25
    • 提问者: 未知
    tr** 受缓冲液的浓度和使用温度的影响。可以参与多种酶反应。答:如果出现**的情况...锦州港股票代码[600190]公司注册名称:锦州港股份有限公司英文全称:jinzhouportco. ...
  • wto5年缓冲期到底什么时候能结束
    • 2024-05-19 11:17:23
    • 提问者: 未知
    缓冲期一到,**就要开放银行,保险,电力等等现在的垄断行业,阻力很大呀!那么多人面临下岗,然后高工资高福利没有市场竞争的好日子一去不复返了,很艰难的抉择。不过我相信对普通人是件好事情!
  • 什么叫做对冲?
    • 2024-05-19 06:35:13
    • 提问者: 未知
    进行实买空卖、风险对冲的操作技巧,在一定程度上可规避和化解投资风险 对冲基金的英文名称为hedge fund,意为"风险对冲过的基金",起源于50年代初的美国。其操作的宗旨,在于...
  • 缓冲病房是什么意思
    • 2024-05-19 21:49:28
    • 提问者: 未知
    当下,在医院各病区都设置有缓冲病房。这是为新入院的病人专门准备的。在患者的核酸检测结果未出来之前,先把新入院患者安置在缓冲病房里,等患者的核酸检测结果出了之后,再把患者迁出缓冲病房,安排到普通病室。病区为新入院病人设置缓冲病房,是按照《关于落实常态化疫情防控要求进一步加强医疗机构感染防控工作的通知》(联防联控机制综发〔2020〕169号)和《**卫生健康委办公厅关于完善发热门诊和医疗机构感染防控工...
  • 什么叫溢价?
    • 2024-05-19 07:15:35
    • 提问者: 未知
    溢价是什么?通讲吧,比如你行债券,面值是10元,市场价是12元按12元卖了,比原来多了2块说明挣了,就是溢价了。对价的公允价值又是什么?对介的公允价值是指市场价值。就是说你有一个机器,这个机器买的时候是100元,但现在的市场价是90元。你和别人交易的时候,只能按90元来交易,因为是市场价,对双方都公平。这就是公允价值。经营租入:是指企业没有钱了,但经营需要,临时租个机器暂时使用,以后还要还人家的。...
  • 什么叫对冲基金
    • 2024-05-19 21:06:12
    • 提问者: 未知
    采用对冲交易手段的基金称为对冲基金(hedge fund)也称避险基金或套期保值基金。是指金融期货和金融期权等金融衍生工具与金融工具结合后以营利为目的的金融基金。它是投资基金的一种形式,意为“风险对冲过的基金”。像黄金和美景就属于对冲,如果投资于这两个品种的基金就是对冲基金了,想学理财可以来卜亚商学院学习
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。