csapp:bomb-lab 解题笔记

这是一个非常有趣的lab。

你可以用gdb,和反编译破解作者设置的密码。当然,作者提供了不带实现的c源码和(估计使用0g优化级别)。降低难度。

###phase1

code:

0000000000400ee0 <phase_1>:
  400ee0:	48 83 ec 08          	sub    $0x8,%rsp
  400ee4:	be 00 24 40 00       	mov    $0x402400,%esi # 关键代码
  400ee9:	e8 4a 04 00 00       	callq  401338 <strings_not_equal>
  400eee:	85 c0                	test   %eax,%eax
  400ef0:	74 05                	je     400ef7 <phase_1+0x17>
  400ef2:	e8 43 05 00 00       	callq  40143a <explode_bomb>
  400ef7:	48 83 c4 08          	add    $0x8,%rsp
  400efb:	c3                   	retq   

做了挺多无用功,比如靠函数名就能才猜到的功能没必要去反推c源码。也了解了elf文件,知道如何定义程序入口。最后使用gdb查看地址找到密码:

0x402400: "Border relations with Canada have never been better."

###phase2

000000000040145c <read_six_numbers>: #   (%rsp) in %rsi  offse comp to 400efe
  40145c:	48 83 ec 18          	sub    $0x18,%rsp #  400efe-64
  401460:	48 89 f2             	mov    %rsi,%rdx #  rdx=rsp-40 save arg2
  401463:	48 8d 4e 04          	lea    0x4(%rsi),%rcx 
  401467:	48 8d 46 14          	lea    0x14(%rsi),%rax
  40146b:	48 89 44 24 08       	mov    %rax,0x8(%rsp) 
  401470:	48 8d 46 10          	lea    0x10(%rsi),%rax
  401474:	48 89 04 24          	mov    %rax,(%rsp) #
  401478:	4c 8d 4e 0c          	lea    0xc(%rsi),%r9 #
  40147c:	4c 8d 46 08          	lea    0x8(%rsi),%r8 #
  401480:	be c3 25 40 00       	mov    $0x4025c3,%esi
  401485:	b8 00 00 00 00       	mov    $0x0,%eax 
  40148a:	e8 61 f7 ff ff       	callq  400bf0 <__isoc99_sscanf@plt>
  40148f:	83 f8 05             	cmp    $0x5,%eax  
  401492:	7f 05                	jg     401499 <read_six_numbers+0x3d>
  401494:	e8 a1 ff ff ff       	callq  40143a <explode_bomb>
  401499:	48 83 c4 18          	add    $0x18,%rsp
  40149d:	c3                   	retq   

read_six_number,根据传入的是栈指针,以及汇编一直在基于栈做赋值之类的运算,可以推测出arg2是数组。再用内存查看对0x4025c3,可以看到是"%d %d …" 六个d。结合sscanf函数的意义,可以理解为把input,即参数0,以指定格式给到六个参数中,这六个参数应该是数组。

这里可以gdb然后画个图方便理解。

再看phase2就比较简单了。

0000000000400efc <phase_2>:
  400efc:	55                   	push   %rbp
  400efd:	53                   	push   %rbx
  400efe:	48 83 ec 28          	sub    $0x28,%rsp # -40
  400f02:	48 89 e6             	mov    %rsp,%rsi
  400f05:	e8 52 05 00 00       	callq  40145c <read_six_numbers>
  400f0a:	83 3c 24 01          	cmpl   $0x1,(%rsp)
  400f0e:	74 20                	je     400f30 <phase_2+0x34>
  400f10:	e8 25 05 00 00       	callq  40143a <explode_bomb>
  400f15:	eb 19                	jmp    400f30 <phase_2+0x34>
  400f17:	8b 43 fc             	mov    -0x4(%rbx),%eax
  400f1a:	01 c0                	add    %eax,%eax 
  400f1c:	39 03                	cmp    %eax,(%rbx)
  400f1e:	74 05                	je     400f25 <phase_2+0x29>
  400f20:	e8 15 05 00 00       	callq  40143a <explode_bomb>
  400f25:	48 83 c3 04          	add    $0x4,%rbx
  400f29:	48 39 eb             	cmp    %rbp,%rbx
  400f2c:	75 e9                	jne    400f17 <phase_2+0x1b> # jump to loop
  400f2e:	eb 0c                	jmp    400f3c <phase_2+0x40> # jump to exit
  400f30:	48 8d 5c 24 04       	lea    0x4(%rsp),%rbx
  400f35:	48 8d 6c 24 18       	lea    0x18(%rsp),%rbp
  400f3a:	eb db                	jmp    400f17 <phase_2+0x1b>
  400f3c:	48 83 c4 28          	add    $0x28,%rsp
  400f40:	5b                   	pop    %rbx
  400f41:	5d                   	pop    %rbp
  400f42:	c3                   	retq  

就是数组开头必须是1,然后依次*2.我们也可以根据-4,+4,+0x18猜到这是一个int 数组。

结果:1 2 4 8 16 32

That's number 2. Keep going!

###phase3

应该是lab里面最简单的一个了。方法本地分配两个变量,假设0x8(%rsp)=a,0xc(%rsp)=b,那么只需要满足公式:8a+0x400f7c=b即可,那么设置a=0,指令会跳转到0x400f7c处,可以看到直接赋值%rax 0xcf,那么我们只需要另b=207就行了。400fbe地址处

 400f43:	48 83 ec 18          	sub    $0x18,%rsp
  400f47:	48 8d 4c 24 0c       	lea    0xc(%rsp),%rcx 
  400f4c:	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值