拆弹实验-phase_5

phase_5:指针

先找到phase_5反汇编得到的代码段:

00001686 <phase_5>:
    1686:	55                   	push   %ebp
    1687:	89 e5                	mov    %esp,%ebp
    1689:	57                   	push   %edi
    168a:	56                   	push   %esi
    168b:	53                   	push   %ebx
    168c:	83 ec 18             	sub    $0x18,%esp
    168f:	e8 7c fb ff ff       	call   1210 <__x86.get_pc_thunk.bx>
    1694:	81 c3 6c 39 00 00    	add    $0x396c,%ebx
    169a:	8b 75 08             	mov    0x8(%ebp),%esi
    169d:	56                   	push   %esi
    169e:	e8 a1 02 00 00       	call   1944 <string_length>	#推测可能要输入一个字符串
    16a3:	83 c4 10             	add    $0x10,%esp
    16a6:	83 f8 06             	cmp    $0x6,%eax	#推测字符串的长度应该是6
    16a9:	75 2d                	jne    16d8 <phase_5+0x52>
    16ab:	89 f0                	mov    %esi,%eax	
    16ad:	83 c6 06             	add    $0x6,%esi
    16b0:	b9 00 00 00 00       	mov    $0x0,%ecx
    16b5:	8d bb c0 e1 ff ff    	lea    -0x1e40(%ebx),%edi
    16bb:	0f b6 10             	movzbl (%eax),%edx
    16be:	83 e2 0f             	and    $0xf,%edx	#每次去一个字符串进行与运算
    16c1:	03 0c 97             	add    (%edi,%edx,4),%ecx	#进行了某种转换,将结果放在ecx中
    16c4:	83 c0 01             	add    $0x1,%eax
    16c7:	39 f0                	cmp    %esi,%eax	#循环进行616c9:	75 f0                	jne    16bb <phase_5+0x35>
    16cb:	83 f9 37             	cmp    $0x37,%ecx	#6次循环后,ecx中的值应该是37
    16ce:	75 0f                	jne    16df <phase_5+0x59>
    16d0:	8d 65 f4             	lea    -0xc(%ebp),%esp
    16d3:	5b                   	pop    %ebx
    16d4:	5e                   	pop    %esi
    16d5:	5f                   	pop    %edi
    16d6:	5d                   	pop    %ebp
    16d7:	c3                   	ret    
    16d8:	e8 92 04 00 00       	call   1b6f <explode_bomb>
    16dd:	eb cc                	jmp    16ab <phase_5+0x25>
    16df:	e8 8b 04 00 00       	call   1b6f <explode_bomb>
    16e4:	eb ea                	jmp    16d0 <phase_5+0x4a>

对代码进行分析,我先输入了6个数字,发现每次循环都会给ecx加上一个数,我猜想可能是输入的每一位数字,经验证,猜想不成立,也不是ASCII码的低四位,但是因该与ASCII有关。我没有继续细究,而是将每个数字都输一遍,找到对应的数,类似翻译密码。操作如下:
test1
我输入了543210,之后又测试了6789ab,通过ecx的变化值得到密码表如下:

0 ——> 0x2
1 ——> 0xa
2 ——> 0x6
3 ——> 0x1
4 ——> 0xc
5 ——> 0x10
6 ——> 0x9
7 ——> 0x3
8 ——> 0x4
9 ——> 0x7
a ——> 0xa
b ——> 0x6

我猜想,只要让输入的六个数对应的值的和为0x37,就能通关。我输入的是145688。很幸运,这次又猜对了!
寄存器的值
可以看到,在加上最后一个数后,ecx的值已经变为0x37。通关了!
通关
答案不唯一。拆弹实验推荐安装peda,确实能给拆弹带来很多便利。安装教程链接如下:
Ubuntu安装peda

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>