先编写test.c
#include <stdio.h>
#include <string.h>
void function2(){
printf("Execution flow changed\n");
}
void function1(char *str){
char buffer[5];
strcpy(buffer,str);
}
void main(int argc,char *argv[])
{
function1(argv[1]);
printf("Executed normally\n");
}
安装完整的gcc编译包
sudo apt-get install gcc-multilib
用32位编译test.c, -fno-stack-protector:关闭堆栈保护机制. -z execstack:打开堆栈可执行机制
gcc -m32 -g -fno-stack-protector -z execstack -o bufferoverflow test.c
运行测试:
安装gdb
sudo apt-get install gdb
进入gdb调试
gdb bufferoverflow
在第9行下断点,即当function1函数退出时,找到返回地址,用function2的起始地址覆盖掉返回地址
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!