It's our wits that make us men.

2019/3/29 二进制拆炸弹phase_5(二)

Posted on By LuLu

二进制拆炸弹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时显示运行成功。