简介
在实验 0 中,你需要通过阅读汇编代码以及使用调试工具来拆除一个 二进制炸弹程序。本实验分为两个部分:第一部分介绍拆弹实验的基本知 识,包括 ARM 汇编语言、QEMU 模拟器、GDB 调试器的使用;第二部分 需要分析炸弹程序,推测正确的输入来使得炸弹程序能正常退出。
文档链接:Lab0:拆炸弹 - IPADS OS Course Lab Manual
军火展示(炸弹总览
|
|
phase_0
|
|
x0
存的是我们输入的字符串,w0
中存着read_int
返回值,通过gdb的打印,我们可以知道答案为2022
phase_1
|
|
x1
中存储的是字符串的起始地址,所以在gdb打印的时候需要再次解引用
答案:The Network as a System and as a System Component.
phase_2
|
|
根据注释中的讲解,我们很容易就推出答案:1 1 5 9 17 29 49 81
phase_3
这是一道多解题,这里只展示第一种解
|
|
输入两个数x1
,x2
,若 x1
为 3,则 x1
== (x2
» 3) & 7
答案:3 3
or 3 24
…(符合上述规则都对)
phase_4
|
|
|
|
-
这道题有点难,但我们可以很快知道需要输入一个长度不大于10的字符串,且我们也可以很快知道最终要比较的字符串为
isggstsvkt
-
接下来是要知道两个加密函数做了些什么,然而通过看代码,我们其实很难看懂是怎么加密的,但是我们可以通过不断地输入来获取算法结果,最终得到算法的加密方式。
-
通过输入
0123456789
我们可以得到经过加密函数1之后的结果为0246813579
,很显然这是将位置做了一下调换。然而这个输入在加密函数2中直接就爆炸了 -
结合最终字符串以及输入
0123456789
的结果,我们可以猜测函数2是一个字母表的加密算法,故而我们尝试输入abcdefghij
,得到经过加密函数2的结果为qetuowryip
,之后我们可以很容易的得到abcdefghij
在加密表中对应qwertyuiop
,将26个字母都输入了一遍之后,我们就可以知道应该输入的字符串为helloworle
phase_5
|
|
|
|
这道题也很难,但我们可以一力破万法,既然我们已经知道需要遍历一个二叉树,那我们一个个打印,可以知道二叉树的结构如下:

如果你懒得看func_5
的逻辑了,那么你可以跟我一样一个一个试,将所有二叉树插入节点的位置都试一遍,比如:0, 4, 21, 38, 50, 56, 89, 92
,当我们试到89
时就得到答案了。