Bomb Lab
Bomb Lab 解析
Bomb Lab 实际就是通过反汇编和GDB对一个二进制文件行进分析,寻找每一个阶段需要输入的特定字符串。主要考察对汇编代码、栈帧、寄存器的熟悉程度以及使用GDB的能力。
环境设置
推荐大家使用docker构建一个环境方便省时:
1 | image = "zwang/csapp" |
上面的命名会直接从远程docker仓库pull一个我设置好的环境,并且进入那个docker的bash。环境中已经装好了:vim, gdb, cgdb 等一些列方便调试的软件和必要的 c 语言相关库。
GDB小抄
1 | - info r, 展示寄存器内容 |
Phase 1
首先观察源代码入口 bomb.c
:
1 | input = read_line(); /* Get input */ |
每一个阶段都是上面的模式,读取输入的字符串,传入每一个阶段的函数体,在函数体中检测输入的字符串是否与程序预设相同,如果相同则进入下一阶段。另外,lab还推荐写一个文本文件作为每一步的结果,这样方便测试,该文件每一行就是每一阶段的答案。本文假设该文件名为psol.txt
。
首先,为了更完成的看到反汇编代码,我们做objdump -d bomb > bomb.as
获得二进制炸弹的汇编代码方便查阅。当然,本文使用 cgdb 作为调试工具,可以相对方便的在调试过程看到机器码,也可以不必一直参考汇编代码文件。
1 | # 进入debug模式 |
得到如下phase_1的汇编:
1 | 1│ Dump of assembler code for function phase_1: |
我们逐一分析:
- 申请8字节的栈空间
- 把0x402400放入%esi,我们知道esi会存放接下来函数调用的第二个参数,第一个参数在%edi
- 然后调用strings_not_equal函数
分析到这里已经比较清楚,我们只需要看一下0x402400
这个内存地址放了什么东西,我们输入的字符串,应该就是要跟这个东西比较的,因为这是strings_not_equal的第二个参数。
1 | (gdb) x/s 0x402400 |
因此,我们只需要把 Border relations with Canada have never been better.
写入 psol.txt 的第一行,作为我们炸弹阶段一的答案。
如果不担心炸弹会爆炸,我们可以试一试:./bomb < psol.txt
。