CSAPP的bomb lab是让你通过反汇编和gdb,找到六个相应的字符串,来拆掉炸弹。
本实验一共六个阶段,每个阶段对应一个字符串。在完成这六个阶段以后,还有一个彩蛋secret_phase。彩蛋可以在反汇编的代码中看到,只能通过gdb进入,没有出现在main
函数中。
整个实验的整体框架可以在bomb.c
文件中看到。主要是用的工具是gdb和objdump。
下面的代码都是在gdb中反汇编出来的代码,通过gdb反汇编出来的代码跳转地址是用的绝对地址,比较好看。
phase_1:
0x0000000000400ee0 <+0>: sub $0x8,%rsp
0x0000000000400ee4 <+4>: mov $0x402400,%esi
0x0000000000400ee9 <+9>: callq 0x401338
0x0000000000400eee <+14>: test %eax,%eax
0x0000000000400ef0 <+16>: je 0x400ef7
0x0000000000400ef2 <+18>: callq 0x40143a
0x0000000000400ef7 <+23>: add $0x8,%rsp
0x0000000000400efb <+27>: retq
第一阶段是将输入的字符串与位于0x402400
比较,如果相等则成功。函数strings_not_equal
做的事情就是比较两个字符串,如果相等就返回0,反之返回1。
在strings_not_equla
中首先调用string_length
测量两个字符串的长度,不想等直接返回1,相等的话在逐一比对字符串中的字符,全部相等返回0。
答案就是储存在0x402400
里面的字符:Border relations with Canada have never been better.
phase_2:
0x0000000000400efc <+0>: push %rbp
0x0000000000400efd <+1>: push %rbx
0x0000000000400efe <+2>: sub $0x28,%rsp
0x0000000000400f02 <+6>: mov %rsp,%rsi
0x0000000000400f05 <+9>: callq 0x40145c
0x0000000000400f0a <+14>: cmpl $0x1,(%rsp)
0x0000000000400f0e <+18>: je 0x400f30
0x0000000000400f10 <+20>: callq 0x40143a
0x0000000000400f15 <+25>: jmp 0x400f30
0x0000000000400f17 <+27>: mov -0x4(%rbx),%eax
0x0000000000400f1a <+30>: add %eax,%eax
0x0000000000400f1c <+32>: cmp %eax,(%rbx)
0x0000000000400f1e <+34>: je 0x400f25
0x0000000000400f20 <+36>: callq 0x40143a
0x0000000000400f25 <+41>: add $0x4,%rbx
0x0000000000400f29 <+45>: cmp %rbp,%rbx
0x0000000000400f2c <+48>: jne 0x400f17
0x0000000000400f2e <+50>: jmp 0x400f3c
0x0000000000400f30 <+52>: lea 0x4(%rsp),%rbx
0x0000000000400f35 <+57>: lea 0x18(%rsp),%rbp
0x0000000000400f3a <+62>: jmp 0x400f17
0x0000000000400f3c <+64>: add $0x28,%rsp
0x0000000000400f40 <+68>: pop %rbx
0x0000000000400f41 <+69>: pop %rbp
0x0000000000400f42 <+70>: retq
第二阶段让我们输入六个数字,通过read_six_numbers
,把输入的六个数字储存在栈中。并且第一个数字必须是1(代码0x400f0a
),然后通过一个循环(从0x400f1a
到0x400f2c
)来计算后一个数必须是前一个数的两倍,而且我们知道第一个数必须是1。所以答案是:1 2 4 8 16 32
。
phase_3:
0x0000000000400f43 <+0>: sub $0x18,%rsp
0x0000000000400f47 <+4>: lea 0xc(%rsp),%rcx
0x0000000000400f4c <+9>: lea 0x8(%rsp),%rdx
0x0000000000400f51 <+14>: mov $0x4025cf,%esi
0x0000000000400f56 <+19>: mov $0x0,%eax
0x0000000000400f5b <+24>: callq 0x400bf0 <__isoc99_sscanf@plt>
0x0000000000400f60 <+29>: cmp $0x1,%eax
0x0000000000400f63 <+32>: jg 0x400f6a
0x0000000000400f65 <+34>: callq 0x40143a
0x0000000000400f6a <+39>: cmpl $0x7,0x8(%rsp)
0x0000000000400f6f <+44>: ja 0x400fad
0x0000000000400f71 <+46>: mov 0x8(%rsp),%eax
0x0000000000400f75 <+50>: jmpq *0x402470(,%rax,8)
0x0000000000400f7c &l