初步认识栈溢出漏洞

初步认识栈溢出漏洞

  1. 什么是栈?

栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。栈的作用如同一个缓冲区,保存着函数所需的所有信息。在函数的开始时候产生栈,并在函数的结束时候释放它。栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。

  1. 缓冲溢出分为两种,一种是栈溢出,一种是堆溢出。
  2. 如何找到栈?

EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。

ESP:扩展栈指针。这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。

EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。

  1. 通过实践来进行处理

     首先演示一下栈的形成:下面是以下代码;

#include<stdio.h>
int main()
{
    _asm
    {
        push 0x12345678
        pop eax
    }
}

      我们可以在VC++6.0 进行调试来观察一下esp和eip以及ebp的状态变化;

      我们F11来进行跟进下,就会发现esp栈顶指针会跟随变化,因为我们向栈中压人了12345678这样四个字节的数据,指针会减小4个字节的。

 

      而我们pop的时候就会发现栈顶指针就变大成为了原来的样子。这就告诉我们一个道理栈中压人数据的时候栈顶指针是变小的,而弹出栈的时候栈顶指针是变大的。也就是栈底地址高于栈顶地址。

      接下来演示函数内栈的调用过程。

     首先没有进入到overflow函数里面的的时候ebp和esp都是有值得,说明外面的main函数也有栈的实现。我们反汇编看一下具体栈的实现。F11单步走一下就会发现一个跳转jmp跳转到函数overflow。

     这时候后我们单步运行F11。

00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,44h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-44h]
0040102C   mov         ecx,11h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:        int our=0;
00401038   mov         dword ptr [ebp-4],0
6:        return;

     就会看到如上代码,这时候我们来进一步分析一下。首先它将ebp指针压人栈内,将当前的esp指向的地址给了ebp,这时候esp减小了44h,这时候在堆栈中又开辟了一个长度为44h的一个新的栈空间。从我们分析可以得出dword ptr[ebp-4],0这个局部变量是存放在新的栈空间里面的。ebp-4远远小于44h空间大小。局部变量是存放在栈中的。

     通过这个例子我们可以得出一个结论就是:

栈中存放的数据是什么?

      如果程序要调用某个函数,那么计算机就会自动将函数返回后执行的指令地址先压入栈里,等函数调用完之后再从中取出,跳转到该处执行。

溢出的原因?

      正式因为先放入栈的地址在前,而后放入栈的数据一旦过长,就会覆盖到前面的地址这就会导致程序发生错误。

     下面来看一下如下的例子来演示栈溢出现象;

#include<stdio.h>
#include<string.h>
#include<windows.h>
void overflow(char *buf)
{
    char des[5]="";
    strcpy(des,buf);
    return;
}
void main(int argc,char *argc[])
{
    LoadLibrary("user32.dll");
    char longbuf[100]="aaaaaaaaaaaabbbbcccccccccccc";
    overflow(longbuf);
    return;
}

程序一运行就会停止工作:

     下面我们来但不跟踪一下程序:

    首先先把函数下一个地址以及参数压入栈中:

     这时候但不运行到了strcopy这里:这是我们会发现将参数的值出来放在寄存器edx里面了,请看下面图:48 FF 18 00

    这时候将程序运行到了ret的时候发现程序被strcopy给覆盖了。

     返回地址变成了62626262;

     这是返回地址是错误的所以就会爆出该内存不可读之类的错误提示。

     接下来的操作就是将溢出的地址跳转到一个地方然后对让它执行我们要执行的操作,执行完之后再跳转回真实的返回地址就达到了我们想要的目的。

     我们分两个环节来讲。上面讲述的是栈溢出的原理,下面的一个章节用来将栈溢出的利用。

 下一篇文章地址:(栈溢出的利用)http://www.cnblogs.com/dwlsxj/p/StackOverflow_1.html

如果有地方写错了还望各位大牛指正,小丁改正。

转载于:https://www.cnblogs.com/dwlsxj/p/StackOverflow.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值