计算机系统buflab实验报告.docx
《计算机系统buflab实验报告.docx》由会员分享,可在线阅读,更多相关《计算机系统buflab实验报告.docx(10页珍藏版)》请在冰点文库上搜索。
计算机系统buflab实验报告
课程实验报告
课程名称:
计算机系统
实验项目名称:
buflab
专业班级:
计科1708
姓名:
学号:
指导教师:
完成时间:
2019年5月29日
信息科学与工程学院
实验题目:
bufferlab
实验目的:
此任务将帮助您详细了解IA-32调用约定和堆栈组织。
它涉及对实验室目录中的可执行文件bufbomb应用一系列缓冲区溢出攻击。
注意:
在本实验室中,您将获得五种方法的经验,其中一种方法通常用于利用操作系统和网络服务器中的安全弱点。
我们的目的是帮助您了解程序的运行时操作,并了解这种形式的安全弱点的性质,以便在编写系统代码时避免这种情况。
实验环境:
个人电脑、Ubuntu32位
实验内容及操作步骤:
Level0:
Level0是要让test函数调用的getbuf函数返回时不返回到test函数而是返回到smoke函数。
先反汇编getbuf函数
此时栈结构如下
也就是说我们的输入要把smoke的地址覆盖掉返回地址
smoke的反汇编
也就是要输入44个任意字节,然后输入smoke的首地址即可,注意小端法输入
,结果发现错误了,后来发现是因为0a是换行的ASCii码,所以会导致gets函数发生错误的识别,因此把0a改成0b跳转至smoke函数第二行,然后成功
Level1:
在level1中有一个fizz函数,我们需要让test函数返回到fizz,并且我们需要把自己的cookie作为传入参数。
这题的返回跳转函数部分与上一题一致。
Fizz函数如下
getbuf函数反汇编
Fizz函数反汇编
可以看到,fizz函数的传入值就是ebp+8的位置,也就是说需要将ebp+8的位置改为cookie
在getbuf函数返回时,执行leave指令(mov%ebp,%esp和pop%ebp)和ret(pop%eip)指令后,esp的位置如图
在fizz的反汇编中可以看到,需要将新的ebp定位,就需要将返回地址覆盖为fizz函数的第一行或者第二行,如果是第一行,那么先执行一个push%ebp(%esp-4),此时esp指向的是返回地址处,然后第二行mov%esp,%ebp就会把%ebp指向返回地址处,所以cookie的位置是返回地址的位置+8处
而如果是要跳转到第二行,那么cookie的位置为返回
地址的位置+12
运行结果正确!
Level2:
在level2中,需要使程序跳转到自己写的一段反汇编代码,将全局变量global_val设置为cookie的值,随后再跳转到bang函数进行验证。
思路:
把对应的机器码放入buf数组中,使程序执行bang函数。
bang函数的汇编
看到有一个mov的指令和一个cmp的指令,可以肯定一个是global_value一个是cookie
查看一下内存地址
,所以我们需要先把cookie存进去,然后利用把bang函数的首地址push进栈,然后利用ret指令返回到bang函数,所以用来黑程序的反汇编代码如下
,然后利用objdump翻译成机器码
这段机器码可以放在buf的首地址
设置断点查看eax的值(buf首地址)
然后和之前一样,把返回地址的位置设置为buf的首地址跳转到编写的黑代码
结果通过!
Level3:
在level3中,我们需要改变getbuf()函数的返回值,使返回值为cookie值;恢复test函数中的%ebp寄存器内容,并且使test函数正常继续执行接下来的代码。
test函数的反汇编
设置断点查看test的ebp
所以跟之前一样,把写一段代码,修改ebp,修改cookie,然后利用push指令返回到call指令下一条指令
结果通过!
Level4:
在level4中涉及到了两个数:
getbufn、testn。
从参考文档中可知,这个任务要执行5次getbufn和testn
任务是每次要让getbufn返回cookie值,而不是1。
由于getbufn旧的ebp会被覆盖,为了保证连续执行,每次执行完要将ebp恢复为testn函数的ebp。
然后返回到testn的call的下一条指令。
所以恶意代码如下
接下里就需要让返回地址跳转到恶意代码,但是5次getbufn要执行5次,这个时候每次执行的ebp都会不一样,buf的首地址也会不一样,所以先设断点查看一下每次执行的buf首地址
由于不能够确定首地址到底是什么,所以把全部地址都打印一遍,既然我们跳转到的地址无法确定,那么就可以用nop(机器码90)来填充之前的buf,但是要保证跳转到的位置一定是buf之内,所以要选择最大的首地址。
结果通过!
实验结果及分析:
运行结果全部通过!
实验总结:
本次实验主要是对于程序运行时栈的结构的知识的复习和运用,一开始我对于栈溢出攻击的理解只是覆盖返回地址,但是往等级后做实验就发现了新的方法,并且在实验过程中也对函数的返回方式也有了更深的理解,我觉得在实验过程中对于栈空间的知识进行了更好的复习,这样的话我觉得要想对知识理解更好,还需要结合运用的,才会对知识认识得更加透彻。
实
验成绩
实验报告撰写说明
1.实验题目和目的
请从实验指导资料中获取。
2.实验步骤和内容
包括:
(1)本次实验的要求;
(2)源程序清单或者主要伪代码;
(3)预期结果;
(4)上机执行或调试结果:
包括原始数据、相应的运行结果和必要的说明(截图);
3.实验体会
调试中遇到的问题及解决办法;若最终未完成调试,要试着分析原因;调试程序的心得与体会;对课程及实验的建议等。