本次实验实在是坎坷,我把大家可能碰到的问题基本都碰到了一遍,还好在一些编程基础上进行了测试与调试,下面我就把整个实验的过程完整的写在本报告中。
首先,就像教程上做的,将32位编程的一些库加进去:
接下来进入正题,进入32位linux环境,使用bash:
使用地址空间随机化来随机堆与栈的初始地址使得我们猜测准确的内存地址非常困难,因此我们关闭这一功能:
接下来编写stack相信大家都会了,实验教程中也有,因此这里就不再贴出来,编译程序,设置SET-UID:
接下来是写攻击程序,因为教程写的很明白在这我就不过多说明,但是记住,将stack.c和exploit.c都存放在tmp中,tmp文件夹可以在主文件夹中搜索到,在exploit.c中“\x??\x??\x??\x??”处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode保存在 buffer+100 的位置。现在我们要得到shellcode在内存中的地址,输入命令:
结果显示:
接下来按照教程:
根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd010(十六进制)+100(十进制)=0xffffd074(十六进制)
现在修改exploit.c文件!将 \x??\x??\x??\x?? 修改为 \x74\xd0\xff\xff 编译exploit.c并且进行攻击:
产生段错误,这里使我非常苦恼,然后我就进行了测试:
在此终于找到问题,在stack.c中我打错了一个单词:badfile,使得我大动干戈,如果大家有出现段错误的可以按照我的步骤定位你问题出现的地方。首先我定位到了fread的问题,那肯定是有什么地址溢出或者是访问出现了越界之类的问题,然后我努力的查看了exploit.c发现一点问题都没有,就再运行了一遍发现warning中问题出现在了stack.c,这告诉我们每一个warning都是致命的。。。。
接下来,重新计算地址:
然后开始缓冲区溢出攻击:
出现的fault不要怕,重新编译一下stack.c就OK了。
第二个实验则重新开始即可,地址需要重新查看与计算:
发现出现段错误(这是本阶段实验出现的正确的实验结果):
第三个实验还是重新开始,但是这次不加以下代码:
进行相同操作发现可以成功显示root:
最后附上改地址的操作图片:
学习时间 296分钟
操作时间 209分钟
按键次数 4865次
实验次数 3次
报告字数 2899字
是否完成 完成