计组实验5报告_第1页
计组实验5报告_第2页
计组实验5报告_第3页
计组实验5报告_第4页
计组实验5报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: buflab-handout 专 业 班 级: 计科1403 姓 名: 学 号: 指 导 教 师: 黄丽达 完 成 时 间: 2016 年 5 月 31 日信息科学与工程学院实验题目:buflab-handout(缓冲区溢出实验)实验目的:模拟缓冲区溢出攻击,本实验共有5个不同的缓冲区溢出实验,每一个实验要求的返回的地址不一样,前三个允许破坏栈,后两个不允许破坏栈达到攻击目的。实验环境:联想ThinkPad E545,Ubuntu14(32位)gdb工具实验内容及操作步骤:这个实验主要是模拟缓冲区溢出。实验中涉及到3个可执行的二

2、进制文件bufbomb,hex2raw,makecookie。bufbomb是进行缓冲区实验的目标程序;既然是缓冲区溢出实验,肯定得有一个导致缓冲区溢出的条件,这个实验是通过类似于c语言中的gets函数的Gets读取一行数据到固定大小的缓冲区,而当我们的输入超过了缓冲区的大小时,Gets没有任何的边界检查,超过缓冲区的数据就会覆盖内存中用作其它用途的数据,从而改变程序的行为;hex2raw文件的作用是如果gets从终端读取时,无法输入一些不可打印的数据,通过hex2raw可以将16进制表示的字节转换成二进制字节数据。至于makecookie是防止作弊让每个人有不同的userid,从而计算出不同

3、的cookie值。我使用userie为tian得出了我的cookie为0x7b164970.1. Level0: Candle (10 pts)题目要求:让test运行完后,不直接返回退出。而是跳到smoke函数处,继续运行,而当smoke运行完毕后,才退出。test源代码: void test() int val; /* Put canary on stack to detect possible corruption */ volatile int local = uniqueval(); val = getbuf();/* Check for corrupted stack */ if

4、(local != uniqueval() printf(Sabotaged!: the stack has been corruptedn); else if (val = cookie) printf(Boom!: getbuf returned 0x%xn, val); validate(3); else printf(Dud: getbuf returned 0x%xn, val); test源代码:void smoke()printf(Smoke!: You called smoke()n);validate(0);exit(0);由test源代码可以看出其调用了getbuf()函数

5、,可以以此为突破口修改函数的返回地址;观察getbuf函数如下:/* Buffer size for getbuf */ #define NORMAL_BUFFER_SIZE 32 int getbuf() char bufNORMAL_BUFFER_SIZE; Gets(buf); return 1; 可以看出getbuf函数没有检查边界,所以无法避免但缓冲区的数据长度超出给定最大长度(函数定义最大长度为32)造成的后果,我们可以利用这个漏洞来修改test函数执行完成后的返回地址,让test执行完后的返回地址指向smoke函数的入口即可达到实验目的。首先反汇编getbuf函数:从上面图三句可

6、以看到lea把buf的指针地址(-0x28(%ebp)传给了eax寄存器,再把eax寄存器放到栈顶,接着调用Gets()函数,也就是说buf距离返回地址(4(%ebp))的位置有0x28 + 4(%ebp的字节数),即0x2c(44)个字节的距离,于是只要在buf开始处随便填入44个字节,只要不是换行符n(ASCII值0x0a,Gets()函数以n结束,所以前44字节只要不是0x0a都行,并在返回地址处中填入smoke函数的入口地址即可。栈分布如图:getbuf返回地址保存的ebp值 .smoke地址覆盖ebp-4buf-28接下来反汇编smoke函数找到函数入口地址:发现smoke函数入口地

7、址为:0x08048e0a所以根据这个地址构造0.txt文件:一开始是将smoke的入口地址 0a 8e 04 08 覆盖buf返回地址,但是0a是换行符,导致出错所以考虑用smoke入口的下一条地址0x08048e0b覆盖buf的返回地址,既可以避免了换行符的提前结束,也可以进入到smoke函数内部执行,只不过少了push %ebp可能导致ebp值丢失而已,但可以达到实验要求。调试正确:2. Level1: Sparkler (10 pts)题目要求:在level 0的基础上,使getbuf函数的返回指向fizz函数,同时将fizz函数的参数置为userid对应的cookie值,我的user

8、id是tian,cookie是0x7b164970.fizz函数源代码:void fizz(int val)if (val = cookie) printf(Fizz!: You called fizz(0x%x)n, val);validate(1); elseprintf(Misfire: You called fizz(0x%x)n, val);exit(0);反汇编找到fizz函数的首地址:可以看到fizz的首地址为:0x08048daf。这个实验除了要将fizz函数入口覆盖了getbuf中返回地址外,还应将cookie值0x7b164970.输入到fizz函数返回地址的上一个4字节处

9、,即fizz函数参数1地址处。但是这里是直接通过覆盖getbuf的返回地址进入fizz函数的,系统无法将fizz的返回地址压栈,所以我们需要手动将fizz函数的ebp+4处的值用00 00 00 00 或者其它字节覆盖掉,然后再将fizz函数的参数,即fizz函数的ebp+8处用cookie的值覆盖。栈结果如下:getbuf返回地址保存的ebp值 fizz的返回地址fizz的参数1.cookie值00 00 00 00 覆盖fizz入口地址覆盖-4buf-28构造1.txt文件:调试成功!3. Level2: Firecracker (15 pts)题目要求:令getbuf调用后不执行test

10、函数,而是执行bang函数(默认会执行test函数),但是同时我们要修改global_value的值为cookie值。然而,global_value是一个全局变量,它没有储存在栈里面,所以在程序执行过程中,只能通过赋值语句来改变global_value的值。即这次我们不仅要让函数跳到bang中,而且要模拟一个函数调用来进行赋值。bang函数源代码:int global_value = 0;void bang(int val)if (global_value = cookie) printf(Bang!: You set global_value to 0x%xn, global_value);

11、validate(2); elseprintf(Misfire: global_value = 0x%xn, global_value);exit(0);反汇编bang函数:得到bang函数入口地址为:0x08048d52从这两句汇编代码中可以看到,global_value存放在0x804d10c,而cookie存放在0x804d104处通过下来几个命令将global_value的值存为0x7b164970movl $0x7b164970,%eax /将cookie值存入eax寄存器movl %eax,0x804d10c /将eax中的(cookie)值存入global_value的地址pus

12、hl $0x08048d52 /将bang作为返回地址压栈ret /通过ret调用改变eip转到bang函数中因为我们最终要传入gets中,汇编代码是不可以直接传入的,只能传入二进制/十六进制。所以,我们用gas编译器将上面代码转化成二进制。先将上述汇编代码写到global_value.s文件里,再汇编成.o文件,反汇编即可得到汇编代码的二进制组成。所以我们将getbuf的返回地址改成buf的首地址,然后将修改全局变量的代码对应的机器码写入buf的缓冲区中前面的位置,buf首地址上一个栈的4字节改成bang函数的地址。这样当在getbuf中调用ret返回时程序会跳转到buf首地址处,执行写入的

13、恶意指令(修改全局变量的指令),再通过恶意函数中的ret指令跳转原栈中bang的入口地址,再进入bang函数中执行。栈结构示意如下:getbuf返回地址保存的ebp值 bang的入口地址.buf首地址覆盖-4buf-28所以我们还需要找出buf运行时的首地址:注意到getbuf函数里面有这几行代码:可知0x804926b:中的%eax就存着字符串的首地址,也就是buf首地址,通过gdb查看eax中的地址值:得到eax = 0x556831a8,即为buf的首地址。所以构造文本文件2.txt调试成功4. Level 3: Dynamite (20 pts)题目要求:要求getbuf调用后,返回到

14、test当中,但是不能破坏为test函数维护的堆栈状态(test函数加了堆栈状态检测),同时要让test函数调用getbuf后的返回值为自己的cookie。分析:首先我们要知道当我们将getbuf的栈从-0x28(%ebp)这个位置一直覆盖到返回地址0x4(%ebp),显然0x0(%ebp)这个位置也被我们的字符串覆盖了。我们知道,%ebp是栈的基址,也是当前函数的帧指针,要恢复栈的状态,必须先把%ebp的值找出来,再利用我们写入的覆盖代码将它重新赋给%ebp. test函数反汇编代码中有这两句:可知test函数调用getbuf函数后的返回地址为0x08048e50,在地址0x08048e50

15、处使用gdb设置断点即可查看原来%ebp的值,同时eax中的值即为test函数的返回值。用gdb查看ebp的值: 可以得到%ebp原来的值为0x55683200。再构造修改test函数返回值为自己的cookie的汇编代码:movl $0x7b164970,%eax ;将cookie值赋给eax寄存器(函数默认使用eax作为返回值寄存器)pushl 0x08048e50 ;返回地址指向test中的getbuf调用后一条指令地址ret ;返回test继续执行将其保存为return_value.s 并汇编成.o文件,再反汇编得到机器代码:buf首地址为0x556831a8(上题已经求出,不再重复求)

16、栈结构示意如下:getbuf返回地址保存的ebp值 .test中的getbuf调用后一条指令地址0x08048e50buf首地址0x556831a8覆盖%ebp原来的值0x55683200重新覆盖-4buf-28Test函数调用完getbuf函数后,跳转到buf首地址,执行写入的恶意代码(修改eax值的代码),恶意代码中的ret会将函数返回到test中的getbuf调用后一条指令地址0x08048e50继续执行test函数剩下的操作,并且%ebp被原来的值0x55683200重新覆盖构造3.txt文件:调试成功5. Level4: Nitroglycerin (10 pts)题目要求:本级要使

17、用./bufbomb的-n参数,bufbomb不会再像之前那样调用test(),而是调用testn(),testn()又调用getbufn().本级的任务是使getn返回cookie给testn()。听上去似乎与上一级没什么不同,但实际上该级的栈地址是动态的,每次都不一样,bufbomb会连续要我们输入5次字符串,每次都调用getbufn(),每次都要返回自己的cookie值,不能破坏testn的栈状态,每次的栈地址都不一样。反汇编testn代码:可以发现调用完getbufn后返回到0x08048ce2处。反汇编getbufn函数:发现在调用getbufn时,ebp的内容比esp内容大0x21

18、8. 由于,我们这里要调用五次getbufn,所以我们要让前四次getbufn调用完后,继续调用getbufn.我们发现bufbomb在5次调用testn()和getbufn()的过程中,两个函数的栈是连续的,在testn()汇编代码开头有可知%esp=%ebp-0x28,即%ebp=%esp+0x28其中,getbufn执行ret前的leave指令已经正确地恢复%esp(leave等价于 mov %ebp,%esp; pop %ebp,我们的字符串无法覆盖%ebp,%esp寄存器,%esp是从寄存器%ebp里来的,因此是正确的)可以通过下面的恶意代码完成修改返回值和保持栈状态的工作:lea 0x28(%esp), %ebp ;恢复ebp寄存器内容movl $0x7b164970, %eax ;将cookie值写入eax,作为getbufn的返回值pushl $0x8048ce2;返回地址指向testn中的getbufn调用后一条指令ret ;返回testn继续执

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论