在通过了基本的测试程序后,开始分析其原理。
本问的内容还是主要参考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