介绍:这是一个“拆弹”游戏,玩家要在反汇编中找到每一关的拆弹密码,一共有6个phases。 该Lab的下载地址:http://csapp.cs.cmu.edu/3e/labs.html。
警告:本文含有剧透内容,想要玩Lab2的慎看!
首先先看一下phase_3的汇编
0000000000400f43 <phase_3>:
400f43: sub $0x18,%rsp
400f47: lea 0xc(%rsp),%rcx
400f4c: lea 0x8(%rsp),%rdx
400f51: mov $0x4025cf,%esi
400f56: mov $0x0,%eax
400f5b: callq 400bf0 <__isoc99_sscanf@plt>
400f60: cmp $0x1,%eax
400f63: jg 400f6a <phase_3+0x27>
400f65: callq 40143a <explode_bomb>
400f6a: cmpl $0x7,0x8(%rsp)
400f6f: ja 400fad <phase_3+0x6a>
400f71: mov 0x8(%rsp),%eax
400f75: jmpq *0x402470(,%rax,8)
400f7c: mov $0xcf,%eax
400f81: jmp 400fbe <phase_3+0x7b>
400f83: mov $0x2c3,%eax
400f88: jmp 400fbe <phase_3+0x7b>
400f8a: mov $0x100,%eax
400f8f: jmp 400fbe <phase_3+0x7b>
400f91: mov $0x185,%eax
400f96: jmp 400fbe <phase_3+0x7b>
400f98: mov $0xce,%eax
400f9d: jmp 400fbe <phase_3+0x7b>
400f9f: mov $0x2aa,%eax
400fa4: jmp 400fbe <phase_3+0x7b>
400fa6: mov $0x147,%eax
400fab: jmp 400fbe <phase_3+0x7b>
400fad: callq 40143a <explode_bomb>
400fb2: mov $0x0,%eax
400fb7: jmp 400fbe <phase_3+0x7b>
400fb9: mov $0x137,%eax
400fbe: cmp 0xc(%rsp),%eax
400fc2: je 400fc9 <phase_3+0x86>
400fc4: callq 40143a <explode_bomb>
400fc9: add $0x18,%rsp
400fcd: retq
这段汇编首先读入了两个数字N1,N2,存到了栈上,下面是等价的伪c代码:
eax=sscanf(rdi,"%d %d",rsp+0x8,rsp+0xc)
然后11行这里进行判断,限制N1<=7。
第14行,有趣的事情发生了:jmpq *0x402470(,%rax,8)
当时猜了好久什么意思,查了一下发现是间接跳转。
用gdb查一下那个地址有什么值:
(gdb) x/8ag 0x402470
0x402470: 0x400f7c <phase_3+57> 0x400fb9 <phase_3+118>
0x402480: 0x400f83 <phase_3+64> 0x400f8a <phase_3+71>
0x402490: 0x400f91 <phase_3+78> 0x400f98 <phase_3+85>
0x4024a0: 0x400f9f <phase_3+92> 0x400fa6 <phase_3+99>
果然,这是个跳转表。结合上面的代码可以猜测出来这是个switch。 随便找了一个组合过关。