前言
BombLab一定要花时间完成哦,对于期末卷面的提升和计算机系统的理解都非常重要。
导引
①文件目录概览
助教下发一个文件包,打开之后是这样的几个文件。
这几个文件解释如下
- bomb:可执行文件,无法打开,我们主要研究的对象
- bomb.c文件
- bomb-quiet:暂时不需要关注
- README文件
②反汇编
对bomb进行反汇编:在终端中输入以下指令
objdump -d bomb >m.txt
这一步是使用objdump对bomb可执行文件反汇编,并保存在txt文件中。
在这一步之后,文件夹中打开m.txt即可查看汇编代码。
③实验流程-概览
bomb可执行文件会读取你的输入,并与它的内部存储进行匹配。
该可执行文件内部有多段,如果你的输入能够匹配的话,程序就可以继续执行。直到这多段全部完成。这就是最终的成功。否则,如果中间任意一步出现问题,就会爆炸(即结束程序,终端输出bomb)。如下,我输入错误答案1使之引爆。
▲bomb可执行文件大致的执行逻辑可以在bomb.c中看到(bomb.c就是删去了各部分验证函数之后的主函数)
以phase_4为例,bomb读取你的输入,并与内部进行比对,如果正确就继续,否则调用bomb表示该步骤破译失败。
最终在你成功破译所有问题之后,效果大概是这样:
④实验流程-破译
以较为简单的phase_1为例:
汇编代码中,有一段这里调用了explode_bomb,而这是导致程序终止执行的原因,想办法让这句汇编代码不被执行。当然比较容易想到的是跟跳转结合起来,不跳转到这里或者跳转到别的地方即可。再注意到这里的<string_not_equal>似乎是某个字符串比较,可以想到bomb从我这里读入的密码是不是与字符串有关,从而继续研究下去……
⑤实验流程-验证
使用./bomb开始执行炸弹文件,然后逐个输入每题的密码,可以看到是否正确的反馈。
如这里反馈“phase 1 defused” 表示第一个通过了。
逐个这样验证下去直到最终结果。
▲如果出现permission denied的情况,使用chmod 777 bomb,改变可执行文件的权限即可。
⑥实验技巧-逐步调试
使用gdb进行逐步调试,可以提升效率(有时想看如何跳转,有时不想重新开始)
下面开始逐步调试:
gdb -q bomb
若没有gdb,就安装gdb
成功安装后就可以逐步调试
gdb调试是基础,这里不再赘述。
⑦实验技巧-保存答案与快速验证
我不想每次都使用./bomb然后逐个输入答案,这样太烦了。
有没有什么办法能够快速验证我前几步是否正确?
可以将答案写在ans.txt中,一行写一道题目的答案即可。
然后使用./bomb ans.txt来运行,bomb会逐个读入文件中的每一行作为每一题的答案。
★期望
希望你能:
- (重要)独立完成该实验
- 熟练掌握汇编代码的阅读能力
- 总结归纳对于阅读汇编的小技巧,小心得
- 从该实验中收获乐趣