实验介绍
本实验是对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