CSAPP 逆向工程实验(bomb_64)

拆炸弹的作业,还挺好玩的,也不算难这次课开始我才接触linux,命令用得不是很熟练,总体来讲花的时间也不短

本实验我是在刚开学的时候就开始做的,后来发现一开始老师放的作业题是错的,是一个32位的“炸弹”文件,而实际我们要做的是64位的“炸弹”结果我不得不再拆一个炸弹

但是64位的看起来要简单一点,首先代码长度就比32位的那个要短,实际上半个小时左右就写出来了

实验过程和结果

Phase_1

由e74到e80可知,是要做一个字符串比较,输入的字符串与$0x401af8相同即过关。在gdb模式下查看该地址下的数据

貌似Linux下不支持ctrl+c的,只能右键复制

Phase_2

根据ea7的提示,答案是6个用空格隔开的整数

Eba到ed4之间有个循环,可见是在做%rbp+0xc和%rbp,%rbp+0x10和%rbp+0x4,%rbp+0x14和%cbp+0x8之间的比较,有任何一组不相等就boom。

Ed6到edb可见,若(%rbp)+(%rbp+0x4)+(%rbp+0x8)等于0的也会boom

这个时候得看栈帧中存这6个数的顺序了,最简单的方法就是断点调试。尝试输入1 2 3 4 5 6

6个地址存的是我输入的6个数,程序中将前三个与后三个数进行比较,并判断前三个数之和是否为0,即答案是3个和不为0的整数,按顺序重复输入两次,如1 2 3 1 2 3

Phase_3

这么多jmp,八成就是switch结构了


由上图中涂白的地方可知,本关答案是两个整数,且第一个数小于等于7

地址f2b处用了基址偏移,跳到哪里取决于%rax,即第一个数字的大小

8*0到8*7正好对应到不同的地址,相应的%eax也填入不同的值,而%eax的值需要和输入的第二个数字相匹配,如我第一个数字输入7,则第二个数字应输入0x19c的十进制值412

Phase_4


可见这次的答案是一个大于0的整数。程序中还调用了func4


开始时给%eax赋1,。若%edi的值小于等于1,则跳出func4,在ff3处开始让%eax与37比较,若不等则boom,故我们输入的参数必须是一个大于1的参数。若大于1,则让参数减去1并将其作为一个新参数,再调用一次func4,这里将其记为f(n-1),之后有做了f(n-2),并让其与f(n-1)相加赋给%eax,然后返回。故从func4出来后的结果为f(n)=f(n-1)+f(n-2)。可以算出,f(9)=55。9就是本关的答案。

Phase_5


这次的答案是两个整数,其中第一个整数存在%eax中,且从地址2d到37可看出,只保留其16进制值的前四位,且不能为15。涂白的地方为一个循环,edx作为循环的计数器,由地址5a可知,本次循环次数为12。地址48中是将一个数组中的元素取出,同时这个元素的值作为下次使用的数组下标的一个因数,并且用ecx对提取出的元素进行累加,本次循环的结束条件为取出的元素为15。

我擦看着就觉得很麻烦,但还是要优雅地说出 不难推算出,满足条件的答案是7 93

Phase_6

关底竟然是个弱智


地址ec和08中的0x20168e(%rip)和0x201672(%rip)中存的应该是输入的数据,这时可以直接查看(%rax)里的值即可

最终答案


-------------------------------------------------------------------

那个32位下的炸弹的第六关才是真实boss,本来想放上来给各位观赏一下的,发现稿子被我弄丢了有兴趣的请自行搜索引擎一下

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值