CSAPP Lab2 Bomb小记一

实验概述

这是一个非常有趣的实验,实验以通关(phase)的形式来呈现汇编语言学习的重点与难点,并且一环扣一环,除了必须要经过的六个phase外,还有一个secret phase,接下来我们看一下如何破解这些phase。

实验过程

首先,输入命令objdump -d bomb > bomb_assembly.S,得到bomb_assembly.s反汇编文件。
在
之后在终端用gdb对bomb.c进行调试。
在这里插入图片描述

phase 1破解

首先给出phase 1的反汇编代码:
在这里插入图片描述
347: 压栈
348:将0x402400存入%esi // gdb调试,查看该地址,发现其存储一条字符串。
在这里插入图片描述
349:调用strings_not_equal函数,根据函数我们知道要传入参数(r12),该参数就是输入的字符串,%rsi中给定的字符串存入%rbp中,%r12中的字符串存入%eax中,接下来比较字符串,将比较结果存入%eax中。
350:测试strings_not_equal的结果
351:若输入与给定一致,成功跳出函数
352:若不一致,炸弹爆炸!
结果:
在这里插入图片描述
phase_1成功破解!

phase 2 破解

首先给出phase 2的反汇编代码:
在这里插入图片描述
首先设置断点
在这里插入图片描述
接着执行程序
在这里插入图片描述
phase_2提出问题:How about the next one?
分析汇编:
357: 压栈 %rbp
358:压栈 %rbx
359:压栈 %rsp
360: 将%rsp的值存入%rsi
361:调用read_six_numbers函数
在这里插入图片描述
分析函数可知,栈顶指针下移24个字节,猜想在栈中存储了六个参数,之后我们看到给%esi赋值0x4025c3,我们猜想这个值与地址或字符串存储有关。
在这里插入图片描述
查看地址,没有什么特殊性,接下来我们查看是否与字符串有关。
在这里插入图片描述
结果发现正好验证了我们之前的猜想:输入六个数字。接着调用scanf函数,并将%eax中的值与5进行比较,大于5则成功跳出该函数,结合前面分析,我们猜想%eax中存储的是输入数字的个数,只有输入的数字为6个后phase_2才能继续执行。
362-364:将第一个参数与与1比较,等于1则成功跳转。
说明输入第一个数必须为1
在这里插入图片描述
%rbx存储第二个参数的地址
%rbp存储某个数的地址
跳转到400f17处:
在这里插入图片描述
%eax存储第一个参数2
比较第一个参数
2与第二个参数的值,相等则成功跳转到400f25(不会bomb)
说明后一个数必须是前一个数的2倍
%rbx存储第三个参数的地址
当第三个参数不等于某个数时,继续执行以上的操作直到%rbx与%rbp中的地址值相等
即%rbx存储的是0x18(%rsp),结合前面read_six_numbers函数压栈分析,当第六个数输入完毕时,整个phase_2成功退出。
由以上分析知,输入的数值为:
1 2 4 8 16 32

在这里插入图片描述
phase_2成功破解!

phase 3 破解

给出phase 3的反汇编代码:
在这里插入图片描述在这里插入图片描述
设置断点
在这里插入图片描述
执行程序
在这里插入图片描述
分析汇编:
384:压栈
385-386:参数入栈(%rdx,%rcx)
387:查看0x4025cf:
在这里插入图片描述
输入两个数字
388-394:%eax中的值要大于1,即输入的数字数量要为2
%rdx中的值要小于等于7,即输入的第一个参数值小于等于7(且为无符号数)
则取值范围是0-7
395:将%rdx中的数放入%eax中
396:进入跳转表。查看跳转表的表项:(%rdx代表第xx项)
第0项:0x400f7c处:%eax的值为207,跳转到比较阶段
在这里插入图片描述
第1项:0x400fb9处:%eax的值为311,进入比较阶段
在这里插入图片描述
第2项:0x400f83处:%eax的值为707,进入比较阶段
在这里插入图片描述
第3项:0x400f8a处:%eax的值为512,进入比较阶段
在这里插入图片描述
在这里插入图片描述
第4项:0x400f91处:%eax的值为389,进入比较阶段
在这里插入图片描述
第5项:0x400f98处:%eax的值为206,进入比较阶段
在这里插入图片描述
第6项:0x400f9f处:%eax的值为682,进入比较阶段
在这里插入图片描述
第7项:0x400fa6处:%eax的值为327,进入比较阶段
在这里插入图片描述
比较阶段:比较%eax和%rcx中的值,相等则成功跳出phase_3,否则bomb。
在这里插入图片描述
由分析知,输入两个数,第一个数字代表的表项的值与第二个数字相等时phase_3成功
则可以输入的数对值为:
0 207
1 311
2 707
3 512
4 389
5 206
6 682
7 327
举两个例子:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值