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