secret_phase密码如下:47破解过程:
- 首先要找到入口,看phase_defused函数
发现分别为 1 2 3 4 5 6
则可以推断出,要在6个炸弹都拆后才可以进入后边 。
401ae7: be 69 33 40 00 mov $0x403369,%esi401aec: bf 70 58 40 00 mov $0x405870,%edi----401b0c: be 72 33 40 00 mov $0x403372,%esi401b11: 48 8d 7d b0 lea -0x50(%rbp),%rdi401b15: e8 2a fd ff ff callq 401844 <strings_not_equal>先打印出这三个地址的字符串:

文章插图
可以推断出,输入为两个整型变量和一个字符串 。
且这个字符串必须为DrEvil 。但是,phase_4和phase_3的输入都是两个整数
那么我们在判断字符串相等处,设置断点,打印出值观察:

文章插图
10 和 5!
那么就确定为phase_4的答案后加上DrEvil
- 成功进入隐藏关 。
- 看secret_phase函数
401776: 8d 40 ff lea -0x1(%rax),c%eax401779: 3d e8 03 00 00 cmp $0x3e8,%eax //100040177e: 77 27 ja 4017a7 <secret_phase+0x49>401780: 89 de mov %ebx,%esi401782: bf f0 50 40 00 mov $0x4050f0,%edi//此处地址的值为36401787: e8 98 ff ff ff callq 401724 <fun7>40178c: 83 f8 05 cmp $0x5,%eax //返回值得为5则输出值不超1001
输入进func7后,返回值必须为5
- 再看func7函数又是一个分支+递归 。
直接写出伪代码:
则func7(* p, int res, int x)。
一开始,\(*p = 36\),x为你输入的数 。
if(x < *p) p = *(p + 8),func7(p, res, x), res *= 2,return res;else if(x > *p) p = *(p + 10),func7(p, res, x), res = res * 2 + 1,return res;else return 0;那么现在由返回值5逆推
5 = 2 * 2 + 1 p = *p + 102 = 2 * 1 p = *p + 81 = 2 * 0 + 1 p = *p + 100 = 0 *p == x
经验总结扩展阅读
- 公鸡为啥要打鸣
- 天空为什么是蓝的
- 有趣实验 .NET下数据库的负载均衡(续)
- 第五周 python实验报告
- 测定水中声速的实验
- 实验02_Proteus仿真数码管显示代码
- 独立动画是不是实验动画
- 风洞实验室是干嘛的
- 实验02_Proteus仿真数码管显示报告
- 有趣实验 .NET下数据库的负载均衡