二进制炸弹实验 BinaryBombs( 八 )

secret_phase密码如下:47破解过程:

  1. 首先要找到入口,看phase_defused函数
0000000000401ac9 <phase_defused>:401ac9: 83 3d 9c 3c 00 00 06  cmpl  $0x6,0x3c9c(%rip)    \#40576c <num_input_strings>401ad0: 74 01        je   401ad3 <phase_defused+0xa> 在0x401ad0处设置断点,然后打印出0x3c9c(%rip)
发现分别为 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>先打印出这三个地址的字符串:
二进制炸弹实验 BinaryBombs

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

文章插图
10 和 5!
那么就确定为phase_4的答案后加上DrEvil
  1. 成功进入隐藏关 。
  2. 看secret_phase函数
000000000040175e <secret_phase>:401767: e8 32 02 00 00     callq 40199e <read_line>40176f: e8 cc f9 ff ff     callq 401140 <atoi@plt发现了readline函数和atoi函数,说明是输一个数字 。(atoi函数作用为将字符串转为整型)
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
  1. 再看func7函数又是一个分支+递归 。
    直接写出伪代码:
记%rdi 为 p,%rax 为 res, %esi为 x,
则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

经验总结扩展阅读