zoukankan      html  css  js  c++  java
  • 缓冲区溢出攻击-入门例子原理分析

      在通过了基本的测试程序后,开始分析其原理。

      本问的内容还是主要参考http://blog.csdn.net/linyt/article/details/43315429

     

    先回顾下一些基础:

    汇编程序快速入门(32位): http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html

    程序内存空间分配: http://blog.csdn.net/ljianhui/article/details/21666327

    函数帧结构

    现代高级语言C/C++,程序里每个函数对应一个函数帧结构(在栈中),在调用一个函数前,会在栈中保存一些数据,在跳转到新的函数时,新的函数首先建立自己的帧结构,接着计算完成后注销自己的帧结构,并恢复前一个函数的帧结构。

    其中用到的最主要的(上面“汇编程序快速入门”中有详细介绍)就是函数调用时程序的栈中的数据变换,如下图所示。

    针对如下代码:

     1 #include <stdio.h>
     2 
     3 void f(int a, int b)
     4 {
     5     printf("%d
    ", a + b);  
     6 }
     7 
     8 int main()
     9 {
    10     int a = 1;
    11     int b = 1;
    12     f(a, b);
    13     return 0;
    14 }

    其栈中的结构如下图所示,当然这是针对32位程序的~

    1) main函数在调用f函数前,首先将参入的参数压入栈中;

    2)接着,将当前程序执行的下一个的位置EIP加入栈中,后面f函数返回时用;

    3)进入f函数,f函数首先将当前的EBP压入栈中,接着mov esp, ebp(将EBP指向当前的栈顶),接着以EBP为基础构建自己的函数帧结构。

    函数帧结构中包含当前函数的局部变量(攻击的示例程序的buffer变量及在这里面)

     4)在f函数执行完成后,会将栈中的EBP值弹出,恢复到EBP寄存器中,还原ESP寄存器,接着弹出EIP变量,程序根据EIP变量指向的位置接着执行main函数后面的程序部分。

    示例程序的栈结构

    上一节stack1中的main函数调用f函数的栈结构如下图所示:

          

    对buf进行数据拷贝,得到的结果如下图所示:

    当0xffffd710覆盖了原来EIP的位置时,f函数在返回时就会将0xffffd710弹出来给EIP,程序根据EIP的地址寻找下面执行的程序。

    小结

    本节介绍了缓冲区溢出漏洞攻击的原理,主要是修改栈中EIP的值。

    参考:

    http://blog.csdn.net/linyt/article/details/43315429 

  • 相关阅读:
    C#终止线程的方法
    Socket编程(TCP、UDP)
    频率域滤波基础之五(读数字图像处理学习halcon)
    hihoCoder #1127:二分图最小点覆盖和最大独立集
    hihoCoder #1033 : 交错和 (数位Dp)
    HDU-5536 Chip Factory (字典树)
    hihoCoder #1040 (判断是否为矩形)
    hihoCoder:#1079(线段树+离散化)
    HDU-5532 Almost Sorted Array (LIS)
    UVALive-7303 Aquarium (最小生成树)
  • 原文地址:https://www.cnblogs.com/qwertwwwe/p/5747710.html
Copyright © 2011-2022 走看看