CSAPP Bomb phase_5:指针

 

综合分析:

  1. 通过上面的string_length和字符串长度和6比较,得出这是一长为6的字符串
  2. 通过对于循环体的分析,得知先从我们输入的字符串中取一个字符,让其通过与0xf相与实现高位置零,只取低四位。我查到0x804a0d4存的是一个长字符串,把前面找到的低四位当索引,0x804a0d4实际相当于数组名指针,在这个字符串中查找得到的字符保存到栈中。通过循环6次,即从长字符串中得到一个6位的字符串
  3. 执行完后,压入一个字符串,可以查到是“flyer”,后面通过爆炸条件得知,求出的字符串需与其相同才不爆炸,即我们求出的就是“flyer”
  4. f在长字符串中对应的是第9个(从0开始),即索引值是9,得知我们的第一个字符的低四位是9,这是ASCII码,但是考虑到我们键盘输入的大多为字母,我们把高四位值当作96,再加上低四位的9,得到105,即i。(64也可以,得到的是大写I
  5. 同样的处理方法,l索引为15,y索引为14,e索引为5,r索引为6,s索引为7。加上64,再查ASCII表,得出我们的字符串为“ionefg”

测试结果:

08048d48 <phase_5>:
 8048d48:	55                   	push   %ebp
 8048d49:	89 e5                	mov    %esp,%ebp  开辟新栈帧
 8048d4b:	53                   	push   %ebx     被调用者保存现场
 8048d4c:	83 ec 20             	sub    $0x20,%esp  
 8048d4f:	8b 5d 08             	mov    0x8(%ebp),%ebx  ebp+8给ebx
 8048d52:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 8048d58:	89 45 f4             	mov    %eax,-0xc(%ebp)
 8048d5b:	31 c0                	xor    %eax,%eax
 8048d5d:	53                   	push   %ebx  
 8048d5e:	e8 78 02 00 00       	call   8048fdb <string_length> 调用函数返回值为字符串长度,返回值放eax中
 8048d63:	83 c4 10             	add    $0x10,%esp
 8048d66:	83 f8 06             	cmp    $0x6,%eax    比较字符串长度和6的大小
 8048d69:	74 05                	je     8048d70 <phase_5+0x28> 等于6就不爆炸
 8048d6b:	e8 90 03 00 00       	call   8049100 <explode_bomb>
 8048d70:	b8 00 00 00 00       	mov    $0x0,%eax  eax置为0
 8048d75:	0f b6 14 03          	movzbl (%ebx,%eax,1),%edx  将ebx+eax*1给edx
 8048d79:	83 e2 0f             	and    $0xf,%edx   edx和0xf相与,即低四位留下,高四位置零
 8048d7c:	0f b6 92 d4 a0 04 08 	movzbl 0x804a0d4(%edx),%edx 可以查到0x804a0d4存的是一个字符串,把我们一个输入字符的低四位当索引,在这个字符串中查找得到的字符给edx
8048d83:	88 54 05 ed          	mov    %dl,-0x13(%ebp,%eax,1) 将取得的存于栈帧中
 8048d87:	83 c0 01             	add    $0x1,%eax  eax加一,即i++
 8048d8a:	83 f8 06             	cmp    $0x6,%eax  比较eax和6是否等于6
 8048d8d:	75 e6                	jne    8048d75 <phase_5+0x2d> 即eax不为6,循环执行
 8048d8f:	c6 45 f3 00          	movb   $0x0,-0xd(%ebp)
 8048d93:	83 ec 08             	sub    $0x8,%esp
 8048d96:	68 aa a0 04 08       	push   $0x804a0aa  这是一个字符串,可以查到是flyers
 8048d9b:	8d 45 ed             	lea    -0x13(%ebp),%eax 
 8048d9e:	50                   	push   %eax   把上面循环求得的字符串压栈
 8048d9f:	e8 59 02 00 00       	call   8048ffd <strings_not_equal>比较两字符串是否相等
 8048da4:	83 c4 10             	add    $0x10,%esp
 8048da7:	85 c0                	test   %eax,%eax 函数返回值
 8048da9:	74 05                	je     8048db0 <phase_5+0x68> eax=0,即两字符串相等,不爆炸
 8048dab:	e8 50 03 00 00       	call   8049100 <explode_bomb>
 8048db0:	8b 45 f4             	mov    -0xc(%ebp),%eax
 8048db3:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8048dba:	74 05                	je     8048dc1 <phase_5+0x79>
 8048dbc:	e8 cf f9 ff ff       	call   8048790 <__stack_chk_fail@plt>
 8048dc1:	8b 5d fc             	mov    -0x4(%ebp),%ebx
 8048dc4:	c9                   	leave  
 8048dc5:	c3                   	ret   

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值