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

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

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

 

posted @ 2016-08-08 01:18  qwertwwwe  阅读(5235)  评论(0编辑  收藏  举报