CSAPP-拆弹实验

一、phase_1

 查找字符串的位置,设置断点单点调试,查看寄存器ebx里的值,减去1ebc后就是字符串的地址

 

 二、phase_2(循环)

 

 输入六个数,由上图标注指令可以看出第一个数等于1。

add %eax,%eax //每个数是前一个数乘2,也就是等比数列

 可以查看寄存器中的值验证

 

 

 以此类推,执行六次就能得出六个值

答案为:1 2 4  8 16 32

三、phase_3(switch)

首先要知道题目要输入什么

 

 要输入一个整数 一个字符 一个整数

 可以看出是switch跳表

输入第一个数字,就已经确定了第二个字符和第一个数字

 

第一个数字需要小于7

输入0

 跳转到.L25 字符为d 数字为 696

 答案为:0 d 696

 同理,答案还有:1 o 361 等

四、phase_4(递归)

查看这里寄存器中的内容

 

 要求输入两个数

 

 一个数范围2、3、4

输入2,3,查看这一步寄存器eax里的数

 说明这里是第二个数

第一个数查看调用fun4后的返回值,查看寄存器eax

 

 所以答案是162 3

 同理答案还有 108 2、 216 4

五、phase_5(数组)

同理,输入2个整数

第一个数二进制后四位不能是1111

查看数组里的值

 

 最关键的一条指令

 相当于C语言中的 n=a[n]

数组的调用顺序为:

执行15次循环,最后值保存在ecx中

 

 最后ecx值为115,第二个数为115

答案为5 115

六、phase_6链表

输入六个数,为1-6的某个顺序

 寻找六个结点

查看六个结点中的数

 按照降序排序

3ce(2)>396(5)>2e5(4)>24e(1)>163(3)>a3(6)

最终答案为:2 5 4 1 3 6

七、secret_phase(隐藏阶段)

首先要在第四阶段后添加一个字符串

 查找字符串的位置

 fun7是一个递归函数

 参考博客https://www.cnblogs.com/chkkch/archive/2011/05/21/2052708.html

 最后的返回值是6

 只有一种情况符合

 查看答案所在地址,先加4,再加8,加8

 

 最后答案为35

总结:拆弹结束啦

 一开始真的什么都不会,什么指令也不懂,慢慢看大佬写的解析,自己慢慢摸索,一关一关终于解开了。其实里面有很多是运气成分,函数里的代码也只看懂了关键的,其他也没有深究,汇编还是要好好学!像推理一样,拆完每一关都很激动,LOL。

原文地址:https://www.cnblogs.com/Hfolsvh/p/14105434.html