解释:内存溢出、内存泄露、内存越界、缓冲区溢出、栈溢出

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足

需求,于是产生溢出。

================================================================

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用
完了以后却不归还(delete),结果你申请到的那块内存你自己也不能
再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配
给需要的程序。一个盘子用尽各种方法只能装4 个果子,你装了5
个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进
栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称
为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.
以发生的方式来分类,内存泄漏可以分为4 类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被
执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操
作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶
发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存
泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由
于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在
类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内
存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结
束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终
程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几
天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所
有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为
一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄
漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次
性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害

性则非常大,因为较之于常发性和偶发性内存,泄漏它更难被检测到

=================================================================

内存越界:

何谓内存访问越界,简单的说,你向系统申请了一块内存,在使用这块内存的时候,超出了你申请的范围。

内存越界使用,这样的错误引起的问题存在极大的不确定性,有时大,有时小,有时可能不会对程序的运行产生影响,正是这种不易重现的错误,才是最致命的,一旦出错破坏性极大。


什么原因会造成内存越界使用呢?有以下几种情况,可供参考:
例1:
        char buf[32] = {0};
        for(int i=0; i<n; i++)// n < 32 or n > 32
        {
            buf[i] = 'x';
        }
        ....        
例2:
        char buf[32] = {0};
        string str = "this is a test sting !!!!";
        sprintf(buf, "this is a test buf!string:%s", str.c_str()); //out of buffer space
        ....    
例3:
        string str = "this is a test string!!!!";
        char buf[16] = {0};
        strcpy(buf, str.c_str()); //out of buffer space
        
类似的还存在隐患的函数还有:strcat,vsprintf等
同样,memcpy, memset, memmove等一些内存操作函数在使用时也一定要注意。
        
当这样的代码一旦运行,错误就在所难免,会带来的后果也是不确定的,通常可能会造成如下后果:

1.破坏了堆中的内存分配信息数据,特别是动态分配的内存块的内存信息数据,因为操作系统在分配和释放内存块时需要访问该数据,一旦该数据被破坏,以下的几种情况都可能会出现。 
        *** glibc detected *** free(): invalid pointer:
        *** glibc detected *** malloc(): memory corruption:
        *** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
        *** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***        

2.破坏了程序自己的其他对象的内存空间,这种破坏会影响程序执行的不正确性,当然也会诱发coredump,如破坏了指针数据。

3.破坏了空闲内存块,很幸运,这样不会产生什么问题,但谁知道什么时候不幸会降临呢?

通常,代码错误被激发也是偶然的,也就是说之前你的程序一直正常,可能由于你为类增加了两个成员变量,或者改变了某一部分代码,coredump就频繁发生,而你增加的代码绝不会有任何问题,这时你就应该考虑是否是某些内存被破坏了。

排查的原则,首先是保证能重现错误,根据错误估计可能的环节,逐步裁减代码,缩小排查空间。
检查所有的内存操作函数,检查内存越界的可能。常用的内存操作函数:
sprintf snprintf 
vsprintf vsnprintf
strcpy strncpy strcat 
memcpy memmove memset bcopy

如果有用到自己编写的动态库的情况,要确保动态库的编译与程序编译的环境一致。

=================================================================

缓冲区溢出:

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

栈溢出:

 栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。

  栈溢出就是缓冲区溢出的一种。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 缓冲区溢出攻击是一种常见的计算机系统安全漏洞,攻击者利用程序在处理输入数据时未对输入长度进行正确检查的漏洞,向缓冲区中输入超出其容量的数据,导致内存越界,从而执行恶意代码或者破坏目标系统的程序执行流程。 在缓冲区溢出攻击实验中,level 3: rumble 是最高级别的实验。在这个实验中,攻击者需要面对更加复杂的目标系统和更加严格的安全措施。 首先,目标系统在level 3: rumble实验中会具有更多的防御机制,例如ASLR (地址空间布局随机化)和堆栈保护机制。这些防御机制会使攻击者更加困难地绕过目标系统的防御。 其次,在level 3: rumble 实验中,攻击者需要克服更多的挑战来进行缓冲区溢出攻击。例如,攻击者可能需要绕过更多的输入过滤和验证措施,以及发现程序中更加隐藏的漏洞。攻击者可能需要深入了解目标程序的内部机制和底层原理,以便针对性地构造恶意输入。 另外,level 3: rumble 实验中可能还涉及到其他的攻击技术,如返回导向编程(ROP)攻击、格式化字符串攻击等。攻击者需要具备更高的技术水平,才能成功进行这些更复杂的攻击。 总之,level 3: rumble 缓冲区溢出攻击实验是一个更高难度的实验,要求攻击者具备更丰富的知识和技术,能够绕过更复杂的防御机制,并能针对目标系统进行更深入的分析和攻击。 ### 回答2: 计算机系统基础缓冲区溢出攻击实验level 3: rumble是一个高级的缓冲区溢出攻击实验,需要一定的计算机系统知识和技术。缓冲区溢出攻击是一种常见的安全漏洞,攻击者通过向程序的输入缓冲区传递超出其容量的数据,覆盖其他内存区域的数据,实现非法的攻击目的。 在level 3: rumble实验中,攻击者需要深入了解目标程序的源代码和系统结构,包括缓冲区的分配与管理,函数的调用栈等。攻击者需要针对目标程序中的特定漏洞进行攻击,以获取系统权限或执行恶意操作。 具体而言,rumble实验可能涉及以下步骤: 1. 了解目标程序的源代码和漏洞:攻击者需要分析目标程序的源代码,找到其中存在的缓冲区溢出漏洞。这可能涉及到查找可疑函数的调用以及分析程序中的内存布局。 2. 构造恶意输入:攻击者需要构造一组数据,使其超出目标程序中对应缓冲区的容量。这可能需要了解目标程序中缓冲区的大小和分配方式,以及如何覆盖与之相邻的内存区域。 3. 利用缓冲区溢出漏洞:攻击者通过向目标程序输入恶意输入数据,触发缓冲区溢出漏洞。攻击者可能需要使溢出后的数据覆盖目标程序的返回地址或其他关键数据,以控制程序的执行流程。 4. 执行恶意操作:一旦攻击者成功控制了程序的执行流程,就可以执行自己定义的恶意操作。例如,获取系统权限、执行远程命令或者破坏系统的稳定性。 5. 躲避防御机制:为了增加攻击的成功几率,攻击者可能需要绕过目标程序中的防御机制,如栈保护、地址空间布局随机化(ASLR)等。这需要一些额外的技术和经验。 需要注意的是,缓冲区溢出攻击是一种非法的行为,可能导致系统崩溃、数据泄露或者其他安全问题。进行此类攻击需要事先获得合法授权,并在受控环境下进行。同时,在现实应用中,攻击者和开发者都应该重视安全,通过合理的代码编写和安全防护措施来提升系统的安全性。 ### 回答3: 计算机系统基础缓冲区溢出攻击实验level 3: rumble是一个相对复杂的实验,旨在进一步提高对缓冲区溢出攻击的理解和应对能力。 在这个实验中,攻击者将试图通过利用缓冲区溢出漏洞来实现执行恶意代码的目的。与之前的实验不同的是,level 3的实验增加了更复杂的保护机制,包括地址随机化和堆栈不可执行等技术。 在开始实验之前,我们需要了解这种攻击方法的原理。缓冲区溢出攻击是指攻击者通过向程序输入过多的数据,超出了缓冲区本应能够接受数据的范围,从而改变了程序的正常行为。攻击者可以利用这一漏洞来执行恶意代码,例如注入恶意程序、获取权限等。 在level 3的实验中,我们需要实现对程序bug的利用,通过构造特定的输入,使程序运行时发生缓冲区溢出。然后,我们需要分析程序的内存布局,利用地址随机化技术确定目标地址,进而构造出能够执行恶意代码的输入。 与之前的实验不同的是,rumble增加了堆栈不可执行的保护措施。这意味着我们需要找到通常不可执行的存储区域来执行代码,例如函数指针等。 在实验中,我们需要深入理解程序的内存布局、栈和堆的使用,以及各种保护机制。同时,我们还需要使用一些工具和技巧,例如调试器和反汇编,来帮助我们分析程序的行为和构造有效的攻击输入。 通过这个实验,我们将能够更好地理解缓冲区溢出攻击的原理和实现方法。这不仅对于提高我们的安全意识和防御能力有帮助,也能够增加我们在计算机系统基础方面的知识和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值