一、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。