最近写网络安全作业,研究了一下缓冲区溢出攻击的原理,实现过程。原理网上很多,这里就不在赘述了。
我的实验环境是虚拟机ubuntu 18.04.1 LTS,首先来看一段代码。
//bufoverflow.c
#include<stdio.h>
int main(int argc,char **argv){
char buf[10];
strcpy(buf,argv[1]);
printf("buf is 0x%8x\n",&buf);
return 0;
}
这里从命令行输入参数,传到长度为10Bytes的缓冲区里,显然如果我们传入的数据大于10,这里的缓冲区就溢出了。来测试一下,由于现在GCC自己带有缓冲区溢出攻击的检测功能,这里使用-fno-stack-protector先把这个功能关闭掉。终端输入
pan@ubuntu:~/Documents/myClab$ gcc bufoverflow.c -fno-stack-protector -o bufoverflow.out
对bufoverflow.c进行编译,来运行一下生成的.out文件
pan@ubuntu:~/Documents/myClab$ ./bufoverflow.out `perl -e 'print"A"x10'`
这里用到了perl语言来打印10个大写的A, 那如果我们要打印10个A,后面再跟四个B,怎么写呢?那如果我们打印完又想换行又该如何写呢?
pan@ubuntu:~/Documents/myClab$ perl -e 'print "A"x10,"B"x4'
AAAAAAAAAABBBBpan@ubuntu:~/Documents/myClab$ perl -e 'print "A"x10;print "B"x4 ;print "\n"'
AAAAAAAAAABBBB
pan@ubuntu:~/Documents/myClab$
当然,要实现上面功能的写法多种多样,读者可以深入研究perl语言。
回到主题,我们运行生成的.out文件,得到如下所示:
pan@ubuntu:~/Documents/myClab$ ./bufoverflow.out `perl -e 'print"A"x10'`
buf is 0x4eda6f9e
说明了缓冲区的地址是0x4eda6f9e,但是别着急,尝试再运行一次会得到什么呢?
pan@ubuntu:~/Documents/myClab$ ./bufoverflow.out `perl -e 'print"A"x10'`
buf is 0x2f190b2e