中易网

内存缓冲区溢出是什么原因?

答案:5  悬赏:0  
解决时间 2021-11-13 18:36
内存缓冲区溢出是什么原因?
最佳答案
缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

在计算机安全领域,缓冲区溢出就好比给自己的程序开了个后门,这种安全隐患是致命的。缓冲区溢出在各种操作系统、应用软件中广泛存在。而利用缓冲区溢出漏洞实施的攻击就是缓冲区溢出攻击。缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限。

在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

1.   在程序的地址空间里安排适当的代码。

2.   通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

可以根据这两个目标来对缓冲区溢出攻击进行分类。
全部回答
单的说就是程序对接受的输入数据没有进行有效的检测导致错误,后果可能造成程序崩溃或者执行攻击者的命令,详细的资料可以看unsecret.org的漏洞   一般就是这个原因了
缓冲区溢出   
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。   

缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。
溢出原因
数据类型超过了计算机字长的界限就会出现数据溢出的情况。导致内存溢出问题的原因有很多,比如:
(1)   使用非类型安全(non-type-safe)的语言如   C/C++   等。
(2)   以不可靠的方式存取或者复制内存缓冲区。
(3)编译器设置的内存缓冲区太靠近关键数据结构。
因素分析
1.内存溢出问题是   C   语言或者   C++   语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用   C/C++   语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了   C/C++   语言代码的性能。只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++   语言导致内存溢出问题的可能性也要大许多。其他语言也存在内存溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。
2.   当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了   N   字节大小的内存缓冲区,随后又向其中复制超过   N   字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向   12   盎司的玻璃杯中倒入   16   盎司水,那么多出来的   4   盎司水怎么办?当然会满到玻璃杯外面了!
3.   最重要的是,C/C++编译器开辟的内存缓冲区常常邻近重要的数据结构。假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++   的某些其它数据结构,比如   v-table   、例外事件处理程序、函数指针等,也可能受到类似的攻击。
  溢出原因

  数据类型超过了计算机字长的界限就会出现数据溢出的情况。导致内存溢出问题的原因有很多,比如:

  (1)   使用非类型安全(non-type-safe)的语言如   C/C++   等。

  (2)   以不可靠的方式存取或者复制内存缓冲区。

  (3)编译器设置的内存缓冲区太靠近关键数据结构。

  因素分析

  1.内存溢出问题是   C   语言或者   C++   语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用   C/C++   语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了   C/C++   语言代码的性能。只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++   语言导致内存溢出问题的可能性也要大许多。其他语言也存在内存溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。

  2.   当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了   N   字节大小的内存缓冲区,随后又向其中复制超过   N   字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向   12   盎司的玻璃杯中倒入   16   盎司水,那么多出来的   4   盎司水怎么办?当然会满到玻璃杯外面了!

  3.   最重要的是,C/C++编译器开辟的内存缓冲区常常邻近重要的数据结构。假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++   的某些其它数据结构,比如   v-table   、例外事件处理程序、函数指针等,也可能受到类似的攻击。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
阿迪达斯S码怎么对应的是175/92A?我去专
无可奈何花落去的意思?成语怎么解释?
为什么气压越高沸点越高气压越低沸点越低
嘉兴农商银行地址在哪,我要去那里办事
哈尔滨计时工多钱一小时
炖木瓜牛奶放红糖可以吗
在沈阳哪里有卖乒乓球台的?二手的新的都可以
经营管理心得
大齿轮的半径是小齿轮半径的2倍,大齿轮每分
急!佛山市禅城区意美家陶瓷城有在天天快递的
蛇年生宝宝好吗?
孕妇不吃什么
小孩小学全托好不好
想去杭州良渚玩,良渚有什么旅游景点呀?
浪平法庭地址有知道的么?有点事想过去!
推荐资讯
宏基笔记本风扇声音大是怎么回事?
在确定农副产品的品质时,由于品质标准难以确
笔记本键盘不小心搞了一滴水进去,会有事吗
怀孕了,头位是什么意思?
蝶鱼在深海多少米生活
铃木豪爵(仁和路店)地址有知道的么?有点事想
眼部除皱针都有哪些
梦见夜晚黑夜是什么意思?好不好呢?
室内装修材料清单及价格贵吗
北京长城一日游攻略
台式电脑显示器哪个好
南宁商铺装修公司哪家好?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?