实验原理
实验代码
预先准备:下载一系列东西例如gcc,vim编辑器等
详情可参考如何在 Linux 上安装 C 和 GCC 编译器?_安装c编译器(安装命令:sudo apt-get instal gcc)。安装文本编辑器(安装命令s-CSDN博客
创建StackOverflow.c文件
先贴StackOverflow.c的代码内容
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char input[] = "11112222333344445555666677778888" ;
void inject()
{
printf("*****inject success*****\n");
exit(0);
}
void func_call()
{
char param[16];
//printf("inject address:%p\n", inject);
//printf("param address:%p\n", param);
//printf("input address:%p\n", input);
strcpy(param,input);
}
int main(int argc,char**argv)
{
func_call();
printf("main ...\n");
return 0;
}
运行完后在终端执行
sudo apt-get install gcc-multilib
代表支持交叉编译cross-compiling
sudo sysctl -w kernel.randomize_va_space=0
代表关闭进程空间地址随机化功能
使用
gcc -Wall -g -o StackOverflow StackOverflow.c -fno-stack-protector -z execstack -m32
编译c,并输入 ./StackOverflow进行运行
此时可能会出现main ...或者segmentation fault 等字样。我们想办法运行inject函数
在终端输入 gdb StackOverflow进行反编译
输入disas func_call 和disas inject分别查看两者的位置,找到inject第一行的地址位置
先运行disas func_call
输出后查看开始与结尾,开始为起始地址,ret为返回地址
其中带有(gdb)的为输入的部分,这里+50中的50为第二列ret对应的<+50>
而后运行x/x $esp(但我不知道为啥是这个)
查询inject,disas inject,出现了inject的地址
然后将input[]的内容中的8888改为这个地址,例如图中即改为“1111222233334444555566667777\xed\x61\x55\x56”,各个机器地址不一样,更改数值也不一样。
改完后再次编译运行即可显示inject success