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

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

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

原文链接: https://www.cnblogs.com/qwertwwwe/p/5747710.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/238341

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午5:45
下一篇 2023年2月13日 下午5:45

相关推荐