二进制炸弹实验 BinaryBombs( 六 )

phase_5密码如下:ionefg破解过程:

  1. 设置断点,运行,反汇编
  2. 观察到
4015b7: e8 74 02 00 00      callq 401830 <string_length>4015bc: 83 f8 06         cmp  $0x6,%eax4015bf: 75 24         jne  4015e5 <phase_5+0x3a>推测输入为字符串,且长度为6
  1. 再看接下来一段
4015c1: b8 00 00 00 00      mov  $0x0,%eax4015c6: 83 f8 05         cmp  $0x5,%eax//循环了6次4015c9: 7f 21         jg   4015ec <phase_5+0x41>4015cb: 48 63 c8         movslq %eax,%rcx4015ce: 0f b6 14 0b       movzbl (%rbx,%rcx,1),%edx// 逐个取你输的字符4015d2: 83 e2 0f       and  $0xf,%edx // 转为[0,15]4015d5: 0f b6 92 00 32 40 00  movzbl 0x403200(%rdx),%edx4015dc: 88 54 0d e9       mov  %dl,-0x17(%rbp,%rcx,1)4015e0: 83 c0 01         add  $0x1,%eax可以看出,它取出字符串中每一个字符,然后转为[0, 15]的一个数,然后从地址0x403200 加这个数的偏移量,然后取出一个东西,再把它放入栈的内存中,注意!这里的%dl说明是一个字节,那不还是字符嘛
好,先打印下0x403200处的字符串
二进制炸弹实验 BinaryBombs

文章插图
发现打印出的一段奇怪的字符串 。
但是,根据刚刚分析出的[0,15]的偏移量,我们取出前16个字符
得到:maduiersnfotvbyl
  1. 再将断点设在循环内,每次打印出%dl , 发现对于输入的abcdef,得到了aduier的ASCII码,再联系一下ASCII码的十六进制,a 为0x61 。和0xf做与运算得到 0x1。
  2. 发现,输出的字符串中的字符的ASCII码对0x60的偏移量 与 原字符串的字符的下标是相等的 。
  3. 继续向下看
4015f0: be ae 31 40 00    mov  $0x4031ae,%esi4015f5: 48 8d 7d e9      lea  -0x17(%rbp),%rdi4015f9: e8 46 02 00 00    callq 401844 <strings_not_equal>4015fe: 85 c0        test  %eax,%eax401600: 75 07        jne  401609 <phase_5+0x5e>发现又是字符串匹配,先看看0x4031ae处的字符串
二进制炸弹实验 BinaryBombs

文章插图
根据前面得到的结论 。先取出这些字符,看在原字符串中的下标 。
得到:9 15 14 5 6 7,然后加上0x60, 查阅ASCII码
得到:ionefg
汇编代码:
点击查看代码00000000004015ab <phase_5>:  4015ab: 55                    push   %rbp  4015ac: 48 89 e5              mov    %rsp,%rbp  4015af: 53                    push   %rbx  4015b0: 48 83 ec 18           sub    $0x18,%rsp  4015b4: 48 89 fb              mov    %rdi,%rbx  4015b7: e8 74 02 00 00        callq  401830 <string_length>  4015bc: 83 f8 06              cmp    $0x6,%eax  4015bf: 75 24                 jne    4015e5 <phase_5+0x3a>  4015c1: b8 00 00 00 00        mov    $0x0,%eax// 循环6次 0~5  4015c6: 83 f8 05              cmp    $0x5,%eax  4015c9: 7f 21                 jg     4015ec <phase_5+0x41>  4015cb: 48 63 c8              movslq %eax,%rcx  4015ce: 0f b6 14 0b           movzbl (%rbx,%rcx,1),%edx // 逐个取你输的字符  4015d2: 83 e2 0f              and    $0xf,%edx // 转为[0,15]  4015d5: 0f b6 92 00 32 40 00  movzbl 0x403200(%rdx),%edx  4015dc: 88 54 0d e9           mov    %dl,-0x17(%rbp,%rcx,1)  4015e0: 83 c0 01              add    $0x1,%eax  4015e3: eb e1                 jmp    4015c6 <phase_5+0x1b>  4015e5: e8 56 03 00 00        callq  401940 <explode_bomb>  4015ea: eb d5                 jmp    4015c1 <phase_5+0x16>  4015ec: c6 45 ef 00           movb   $0x0,-0x11(%rbp)  4015f0: be ae 31 40 00        mov    $0x4031ae,%esi  4015f5: 48 8d 7d e9           lea    -0x17(%rbp),%rdi  4015f9: e8 46 02 00 00        callq  401844 <strings_not_equal>  4015fe: 85 c0                 test   %eax,%eax  401600: 75 07                 jne    401609 <phase_5+0x5e>  401602: 48 83 c4 18           add    $0x18,%rsp  401606: 5b                    pop    %rbx  401607: 5d                    pop    %rbp  401608: c3                    retq  401609: e8 32 03 00 00        callq  401940 <explode_bomb>  40160e: eb f2                 jmp    401602 <phase_5+0x57>

经验总结扩展阅读