二进制炸弹(深入理解计算机系统)

本文详细分析了四个阶段的X86汇编实验,包括字符串比较、数字密码、switch-case判断和斐波那契数列。通过理解栈帧、函数调用和条件跳转,找出每关的解密策略。实验不仅要求找到正确答案,更注重提升对代码执行流程和原理的理解,同时锻炼了使用WSL和GDB的技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验介绍

本实验是对CSAPP配套实验的简化改编版本,主要考察阅读X86汇编的能力。总共分为四小关。

  • phase_1: 输入字符串密码

  • phase_2:输入六个数的密码

  • phase_3: 输入两个数,满足switch-case的关系

  • phase_4:输入一个数,满足斐波那契数列的规律

实验环境

  • wsl2.0:Windows的Linux子系统
  • gdb:调试工具
  • objdump:反汇编工具

phase_1

0000000000000c92 <phase_1>:
 c92:	48 83 ec 08          	sub    $0x8,%rsp
 c96:	48 8d 35 03 14 20 00 	lea    0x201403(%rip),%rsi        # 2020a0 <unique_str>
 c9d:	b8 00 00 00 00       	mov    $0x0,%eax
 ca2:	e8 8f ff ff ff       	callq  c36 <strings_not_equal>
 ca7:	85 c0                	test   %eax,%eax
 ca9:	75 05                	jne    cb0 <phase_1+0x1e>
 cab:	48 83 c4 08          	add    $0x8,%rsp
 caf:	c3                   	retq   
 cb0:	b8 00 00 00 00       	mov    $0x0,%eax
 cb5:	e8 d2 fe ff ff       	callq  b8c <explode_bomb>
 cba:	eb ef                	jmp    cab <phase_1+0x19>
  • c92: 为当前函数分配栈空间
  • c96:把0x201403(%rip)这个固定地址传给%rsi
  • c9d:eax清零,之后要放返回值
  • ca2:执行strings_not_equal函数,此函数的返回值放在eax中
  • ca7:检查eax是否为0(实际做的是逻辑与操作,若eax为0,则将ZF位置为1)
  • ca9:eax若不为0则跳转到cb0,可以看到跳转后炸弹爆炸
  • cab: 释放为此函数分配的栈空间
  • caf:返回main函数
  • cb0:eax清零
  • cb5:炸弹爆炸
  • cba:炸弹爆炸后也要把为此函数分配的栈空间释放
0000000000000c36 <strings_not_equal>:
 c36:	48 83 ec 08          	sub    $0x8,%rsp
 c3a:	e8 c1 fb ff ff       	callq  800 <strcmp@plt>
 c3f:	85 c0                	test   %eax,%eax
 c41:	0f 95 c0             	setne  %al
 c44:	0f b6 c0             	movzbl %al,%eax
 c47:	48 83 c4 08          	add    $0x8,%rsp
 c4b:	c3                   	retq  
  • 查看strings_not_equal的汇编,发现若两个字符串相等,eax中返回的是0.

分析以上两段汇编代码知,
我们要输入一段字符串,和0x201403(%rip)这个地址中的字符串进行比较,所以现在只需要打印出0x201403(%rip)这个地址中的内容就可以找到答案了。

在这里插入图片描述

phase_2

0000000000000cbc <phase_2>:
 cbc:	53                   	push   %rbx
 cbd:	48 83 ec 20          	sub    $0x20,%rsp
 cc1:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
 cc8:	00 00 
 cca:	48 89 44 24 18       	mov    %rax,0x18(%rsp)
 ccf:	31 c0                	xor    %eax,%eax
 cd1:	48 89 e6             	mov    %rsp,%rsi
 cd4:	e8 73 ff ff ff       	callq  c4c <read_six_numbers>
 cd9:	bb 00 00 00 00       	mov    $0x0,%ebx
 cde:	eb 03                	jmp    ce3 <phase_2+0x27>
 ce0:	83 c3 01             	add    $0x1,%ebx
 ce3:	83 fb 05             	cmp    $0x5,%ebx
 ce6:	7f 1e                	jg     d06 <phase_2+0x4a>
 ce8:	48 63 c3             	movslq %ebx,%rax
 ceb:	48 8d 15 8e 13 20 00 	lea    0x20138e(%rip),%rdx        # 202080 <magic_num>
 cf2:	8b 0c 82             	mov    (%rdx,%rax,4),%ecx
 cf5:	39 0c 84             	cmp    %ecx,(%rsp,%rax,4)
 cf8:	74 e6                	je     ce0 <phase_2+0x24>
 cfa:	b8 00 00 00 00       	mov    $0x0,%eax
 cff:	e8 88 fe ff ff       	callq  b8c <explode_bomb>
 d04:	eb da                	jmp    ce0 <phase_2+0x24>
 d06:	48 8b 44 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值