`
tubaluer
  • 浏览: 1500243 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

一个小程序的栈溢出

 
阅读更多

看下面代码:


在vs2008下面建个工程,我输入“1234567”的时候输出是“Congralations”,程序是正确的,但是当我输入是“12345678”的时候,崩溃了,于是我把GS关了,结果输出竟然也是“Congralations”。我开始的时候很奇怪,于是我再试了下还是输出“Congralations”。于是用OD调试了下····

首先输入是“1234567”的时候:


这个是子函数cp ()里面的反汇编,程序停在了strcpy之后,这时候EAX(函数执行完的返回值)是0,下面的图是堆栈的情况,字符1对应的16进制是31,由于我是intel的cpu,所以是小端模式(高字节存在地位,低字节存在高位),[EBP-12]到[EBP-4]是数组b[8]的内存地址,从低到高依次存放了“1234567”和’\0′,而[EBP-4]存的是a的值,作为返回值,如果是0那么就代表密码输入正确,否则就失败。输入是“1234567”的情况下,结果子函数返回的是0,输出结果也是正确的。


然后我输入“12345678”的情况:

这下就奇怪了,我们看寄存器EAX的值,竟然也是0!真是奇怪了,“12345678”明明比“1234567”大啊,strcmp返回的结果肯定是要比0大的额,再看看[EBP-4]的值也是0额(是它赋值给EAX的),这就意味着返回值a是0啊,按照正常结果返回值应该是大于0的数啊,奇怪了!我们再看看堆栈情况(下图),[EBP-12]到[EBP-4]是数组b[8]的内存地址,从低到高依次存放了“12345678”,那么‘\0’呢?这里已经是栈溢出了,b[8]只有八个字节,只能存取7个字符+’\0′,现在存取了八个字节+’\0′,肯定溢出了。cpu存取的时候是从低地址到高地址的,也就是说[EBP-4]这个字节里面存的应该是’\0′,但是[EBP-4]本来存的是strcmp的返回值啊,原本是大于0 的数,这下被strcpy执行的时候的’\0′覆盖了,所以[EBP-4]这个字节就变成了0。自然程序输出就有问题了。


最后是输入”123456789″的时候:

按照上面的推论,输入”123456789″的时候,在子函数里,[EBP-12]到[EBP-4]是数组b[8]的内存地址,从低到高依次存放了“12345678”,而[EBP-4]字节里面存的应该是’9′的十六进制39,[EBP-3]存取的是’\0′的十六进制0,再后面两个字节也是0。那么CPU读取的时候从高到底低读取,读出来的结果就是00000039,也就是39,那么返回值也就是39。下面实际的结果:


呵呵,果然如此!这下就搞明白了~~~

上面的程序也只是一个例子来演示栈溢出的结果,实际上,在溢出的时候甚至可以覆盖你的EIP,然后马上HOOK到自己的恶意程序,所以一定要小心栈溢出!

博主新地址www.firefoxbug.net



分享到:
评论

相关推荐

    缓冲区溢出——栈溢出

    缓冲区溢出是计算机安全领域中的一个重要概念,主要发生在程序处理数据时,由于对内存分配不当,导致数据超过了预设的存储空间限制,从而覆盖了相邻的数据区域。在本文中,我们将深入探讨栈溢出这一特殊的缓冲区溢出...

    栈溢出crash小合集

    栈溢出通常发生在程序中当一个函数调用分配的栈空间不足以存储传入的数据时。这种情况下,超出边界的数据会覆盖栈上的其他变量,包括返回地址。攻击者可以利用这一点,篡改返回地址,使得程序在执行完预期功能后跳转...

    栈溢出利用软件漏洞分析入门

    - **案例01**:通过对一个简单的程序进行分析,演示如何找到潜在的栈溢出漏洞并利用它。 - **Microsoft TIFF图像文件处理栈溢出漏洞(MS07-055)**:此案例分析了微软产品中一个著名的栈溢出漏洞,展示了如何通过恶意...

    栈溢出基础知识、栈溢出保护机制、栈溢出利用方法.docx

    栈溢出是计算机安全领域中的一个重要概念,主要发生在程序运行过程中,由于栈空间分配不当,导致数据超出预定的栈帧范围,从而影响到其他栈帧中的数据,甚至可能破坏程序执行流程,造成安全风险。本篇文章将深入探讨...

    从零开始学习软件漏洞挖掘系列教程第二篇:栈溢出覆盖返回地址实践.pdf

    在源码中,test函数使用了strcpy函数将一个字符串复制到局部缓冲区,由于没有检查缓冲区的大小,所以存在潜在的栈溢出问题。在main函数中,通过调用LoadLibrary函数和初始化一个大的字符数组后,调用了test函数,并...

    栈溢出 (1).pdf

    栈溢出是计算机安全领域中的一种常见的漏洞,它发生在程序尝试向栈上的变量写入比分配给该变量的字节还要多的数据时。这种漏洞允许攻击者控制程序的执行流程,进而可能获取系统的控制权。Pwn是黑客的俚语,通常用于...

    浅析栈溢出使用栈时,地址超出了栈的合法范围

    例如,在定义函数中的变量时定义了一个大于栈大小的数组,结果就会产生栈溢出。 第二种情况:在拷贝数组时没有进行越界检查,而栈又是从高向低生长的。最坏的情况是,我们在调用该函数前保存的返回地址被修改了,...

    VB 递归的“栈溢出”

    VB(Visual Basic)同样支持递归,但如果不正确地使用,可能会遇到一个常见的问题——"栈溢出"。栈溢出是由于递归深度过大,导致程序运行时内存栈空间耗尽而引发的错误。下面我们将深入探讨VB中的递归以及如何防止栈...

    使用串口1测试栈溢出,支持FreeRTOS,4个任务,1个定时器和RTC

    首先,栈溢出是指程序运行过程中,栈空间被过度使用,导致存储区域超出预设的栈边界,可能覆盖相邻的数据,引发不可预测的错误或崩溃。在STM32芯片上,每个任务都有其独立的栈空间,因此对栈溢出的检测和预防显得尤...

    栈溢出漏洞

    在“湖湘杯2016网络安全技能大赛pwnme”这个挑战中,参赛者可能需要理解栈溢出的工作原理,分析提供的程序代码,寻找可能的溢出点,然后构造特定的输入数据来覆盖返回地址,实现控制程序执行流程的目的。这需要扎实...

    pwn栈溢出10道练习题有writeup

    栈溢出是由于程序在栈上分配的内存不足,导致额外的数据覆盖了栈上的其他变量,甚至可以覆盖返回地址,从而可能导致代码执行。这种攻击通常发生在C或C++等低级语言中,因为它们没有内置的防御机制,如缓冲区检查。 ...

    Windows漏洞利用开发系列教程第二部分:栈溢出覆盖返回地址

    在这篇标题为“Windows漏洞利用开发系列教程第二部分:栈溢出覆盖返回地址”的文章中,作者详细介绍了如何利用栈溢出漏洞来覆盖程序的返回地址,从而达到控制程序执行流程的目的。栈溢出是一种常见的软件安全漏洞,...

    栈溢出攻击技术 windows linux下的都有

    shellcode是一段能够执行特定操作的机器码,比如打开一个shell,允许攻击者获取系统的控制权。由于Linux使用了NX(No eXecute)保护机制,现代的Linux系统中,攻击者还需要绕过NX,如通过rop(Return-Oriented ...

    二进制漏洞挖掘-栈溢出-开启FORTIFY1

    在我们的测试中,我们发现了一个栈溢出漏洞,在执行scanf时未对缓冲区大小进行判断。这将导致栈溢出漏洞。我们可以使用FORTIFY来防止这种漏洞。 FORTIFY是一种编译选项,可以在编译时检查是否存在缓冲区溢出的错误...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    解决栈溢出的办法有两个: 1. 增大栈空间:可以通过 JVM 参数 -Xss 来调整栈的大小。 2. 改用动态分配,使用堆(heap)而不是栈(stack):可以使用堆来存储大数组或对象,避免栈溢出。 在实际开发中,我们可以...

    栈溢出基础——ROP1.0的例题

    ROP(Return-Oriented Programming)是利用栈溢出的一种高级技术,它不依赖于直接注入恶意代码,而是通过寻找存在于程序中的小段已有的可信任指令(通常称为“gadgets”),并利用这些片段构造出任意代码执行的链条...

    栈溢出入门到放弃_19_7_211

    shellcode是一小段机器码,用于在取得程序控制权后执行特定操作,如打开一个shell,从而实现远程命令执行。当溢出数据覆盖了函数调用栈中的返回地址,程序执行流程将被导向shellcode,而不是正常的程序逻辑。 2. ...

    二进制漏洞挖掘-栈溢出-开启Canary1

    在函数刚进入时,在栈上放置一个标志canary,然后在函数结束时,判断该标志是否被改变,如果被改变,则表示有攻击行为发生,于是停止程序运行。在Linux中,我们将cookie信息称为canary。 -fstack-protector系列选项...

    内存溢出小程序

    内存溢出小程序是一种计算机程序,它在运行过程中出现了内存泄漏问题。内存泄漏是编程中常见的错误,尤其是在使用动态内存分配的语言如C++或C时。它发生在程序申请内存后未能正确释放,导致这部分内存无法被系统再次...

    IAR编译器堆栈溢出问题查找

    堆栈溢出问题在嵌入式开发中是一个常见的问题,特别是在使用IAR编译器进行STM32或LPC系列微控制器编程时。堆栈溢出通常发生在程序中分配的堆栈空间不足以存储所有局部变量、函数参数和返回地址时。这可能导致数据...

Global site tag (gtag.js) - Google Analytics