二进制拆炸弹phase_5(二):
继续分析一下phase_5的汇编代码:
8048d6b: 53 push %ebx
8048d6c: 83 ec 28 sub $0x28,%esp
8048d6f: 8b 5c 24 30 mov 0x30(%esp),%ebx //赋值
8048d73: 65 a1 14 00 00 00 mov %gs:0x14,%eax //赋值
8048d79: 89 44 24 1c mov %eax,0x1c(%esp) //赋值
8048d7d: 31 c0 xor %eax,%eax
8048d7f: 89 1c 24 mov %ebx,(%esp)
8048d82: e8 a4 02 00 00 call 804902b <string_length> //调用函数计算长度
8048d87: 83 f8 06 cmp $0x6,%eax //输入的字符为6个,否则爆炸
8048d8a: 74 46 je 8048dd2 <phase_5+0x67>
8048d8c: e8 c4 03 00 00 call 8049155 <explode_bomb>
8048d91: eb 3f jmp 8048dd2 <phase_5+0x67>
8048d93: 0f b6 14 03 movzbl (%ebx,%eax,1),%edx
8048d97: 83 e2 0f and $0xf,%edx //edx=第一个数后四位
8048d9a: 0f b6 92 e8 a1 04 08 movzbl 0x804a1e8(%edx),%edx
8048da1: 88 54 04 15 mov %dl,0x15(%esp,%eax,1)
8048da5: 83 c0 01 add $0x1,%eax
8048da8: 83 f8 06 cmp $0x6,%eax
8048dab: 75 e6 jne 8048d93 <phase_5+0x28>
8048dad: c6 44 24 1b 00 movb $0x0,0x1b(%esp)
8048db2: c7 44 24 04 be a1 04 movl $0x804a1be,0x4(%esp)
8048db9: 08
8048dba: 8d 44 24 15 lea 0x15(%esp),%eax
8048dbe: 89 04 24 mov %eax,(%esp)
8048dc1: e8 84 02 00 00 call 804904a <strings_not_equal> //调用函数
8048dc6: 85 c0 test %eax,%eax
8048dc8: 74 0f je 8048dd9 <phase_5+0x6e>
8048dca: e8 86 03 00 00 call 8049155 <explode_bomb>
8048dcf: 90 nop
8048dd0: eb 07 jmp 8048dd9 <phase_5+0x6e>
8048dd2: b8 00 00 00 00 mov $0x0,%eax //eax=0
8048dd7: eb ba jmp 8048d93 <phase_5+0x28>
8048dd9: 8b 44 24 1c mov 0x1c(%esp),%eax
8048ddd: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048de4: 74 05 je 8048deb <phase_5+0x80>
8048de6: e8 d5 f9 ff ff call 80487c0 <__stack_chk_fail@plt>//调用函数
8048deb: 83 c4 28 add $0x28,%esp
8048dee: 5b pop %ebx
8048def: 90 nop
8048df0: c3 ret
通过代码可以看出来,需要输入6个字符。
调用了_strings_not_equal函数,所以我们可以断定拆这个炸弹的方法就是从数组中提取“flames”
但是要注意到它的偏移量不是直接通过输入数字获得的。它是通过每个输入的数取低4位,再与0xf进行与运算,结果是什么呢,当然就是输入的数的最后一个字节。
我知道内存中存放数值是变成16进制的,00 00 00 00,它取的是第一个00的后一个0的位置,所以我们输入了之后,我们希望内存是这个样子: 09 00 00 00 ,0F 00 00 00 ,01 00 00 00 ,00 00 00 00 ,05 00 00 00,07 00 00 00
想办法将16进制还原成十进制,这样才是我们要输入的。
ASCII码可显示字符的16进制从20-7E开始,
29 2F 21 20 25 27 对应ASCII码: )/! %‘
39 3F 31 30 35 37 对应ASCII码:9?1057
49 4F 41 40 45 47 对应ASCII码:IOA@EG
59 5F 51 50 55 57 对应ASCII码:Y_QPUW
69 6F 61 60 65 67,对应ASCII码:ioa’eg
尝试到39 3F 31 30 35 37 对应ASCII码:9?1057时显示运行成功。