实验环境:
编译器:vs2015
系统:win10 64位
实验原理
如上图所示,栈地址增长方向是向低地址方向增长的,每次调用函数时,先把参数压入栈底,然后会把被调用函数的返回地址(此地址为call指令下一条指令)压到栈底。另外还需要保存main函数的栈底地址在栈里面,被调用函数的栈顶指针esp被保存为该函数的栈底,接下来的低地址位分配局部变量。
如果c/c++没有检测局部变量内容越界问题,那么,局部变量长度过长时,分配的地址空间直接覆盖了old ebp,同时覆盖了ret addr。而当ret addr指向的是有意义的地址,就会直接执行相关的代码,这就是缓冲区攻击。
实验步骤:
初建项目
在vs2015中新建一个项目,命名为SecurityLab,创建Lab.cpp文件,并把以下代码拷贝到项目中:
#include <stdio.h>
#include <string.h>
void overflow(const char* input)
{
char buf[8];
printf("Virtual address of 'buf' = Ox%p\n", buf);
strcpy(buf, input);
}
void fun()
{
printf("Function 'fun' has been called without an explicitly invocation.\n");
printf("Buffer Overflow attack succeeded!\n");
// your other codes, e.g. deleting files<