• 缓冲区溢出攻击-入门例子原理分析


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

      本问的内容还是主要参考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 

  • 相关阅读:
    单实例应用程序程序
    Jquery自定义滚动条插件
    Js的封装和闭包
    Js 鼠标拖拽div改变其大小
    在小组里遇到的一个让我产生迷惑的题
    一个用来快速生成指定大小的随机不重复int数组的实用方法
    动态绑定ASPxGridView选中状态
    “??”操作符
    小笔记系列——Word 添加行号
    日志 查看匹配内容的前后几行
  • 原文地址:https://www.cnblogs.com/qwertwwwe/p/5747710.html
Copyright © 2020-2023  润新知