From 9aa52c7d767cdbe2e795d6a006cbd27457a8643f Mon Sep 17 00:00:00 2001 From: "18218461270@163.com" <18218461270@163.com> Date: Sat, 2 Aug 2025 16:10:31 +0800 Subject: [PATCH] update bomblab --- labs/bomb/README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/labs/bomb/README.md b/labs/bomb/README.md index 1081aaa..0759b52 100644 --- a/labs/bomb/README.md +++ b/labs/bomb/README.md @@ -1,4 +1,3 @@ -# bomblab 输入命令 `objdump -s -S -d -M att bomb > bomb.s` 进行反汇编。 ## Phase 1 @@ -10,13 +9,13 @@ void phase_1(char str[]) { } } ``` -`explode_bomb` 函数将炸弹引爆,我们不希望它被调用;而 `strings_not_equal` 接受两个字符串作为参数,在两者不相等时返回 `1`,否则返回 `0`。 +> `explode_bomb` 函数将炸弹引爆;`strings_not_equal` 函数接受两个字符串作为参数,在两者不相等时返回 `1`,否则返回 `0`。 显然,输入应为 `Border relations with Canada have never been better.`。 ## Phase 2 逆向工程循环的一些技巧: -- 框选出循环范围,将跳转指令的操作数由地址改为标号; +- 框选出循环范围,将跳转指令的地址改成标号; - 尝试移动整段代码,并修改相应的跳转指令; - 最终使之符合任意一种通用策略。 @@ -56,7 +55,7 @@ void phase_2(char str[]) { } } ``` -`read_six_numbers(int x[])` 读入 6 个整数,并依次存贮到 `x[0]` 至 `x[5]`。 +> `read_six_numbers(int x[])` 读入 6 个整数,并依次存贮到 `x[0]` 至 `x[5]`。 由此可知,输入应为 `1 2 4 8 16 32`。 @@ -205,11 +204,11 @@ void phase_5(char str[]) { cmp $0x18,%rsi jne .L1 ``` -为了理解代码对以 `0x6032d0` 开头的一段内存的读取与写入,我们还需研究其中数据的组织方式,例如: +为了理解代码对以地址 `0x6032d0` 开头的一段内存的读写操作,我们还需研究其中数据的组织方式,例如: ```txt 6032d0 4c010000 01000000 e0326000 00000000 L........2`..... ``` -结合汇编代码,不难猜到这块区域依次存储了两个 `int` 和一个指针,组成一个结构。我们给出它的声明: +结合汇编代码,不难猜到这块区域依次存储了两个 4 字整数和一个指针,组成一个结构。我们给出它的声明: ```c struct chain_node { int val; @@ -278,7 +277,7 @@ void phase_6(char str[]) { 结合链表知识,输入应为 `4 3 2 1 6 5`。 ## 进入 Secret Phase -唯一对 `secret_phase` 的调用位于 `phase_defused` 中。观察 `phase_defused`,在 `num_input_strings`(每次调用 `read_line` 都会使它加 1)等于 6,即完成 Phase 6 后的调用时,该函数从以 `0x603870` 开头的字符串中先后提取了两个整数和一个字符串,并检查提取的字符串是否与 `DrEvil` 相等,若相等,则调用 `secret_phase`。 +唯一对 `secret_phase` 的调用位于 `phase_defused` 中。观察 `phase_defused`,在 `num_input_strings`(每次调用 `read_line` 都会使它加 1)等于 6,即完成 Phase 6 后的调用时,该函数从以地址 `0x603870` 开头的字符串中先后提取了两个整数和一个字符串,并检查提取的字符串是否与 `DrEvil` 相等,若相等,则调用 `secret_phase`。 `0x603870` 这个地址并没有在其他任何地方出现过,但是在 `skip` 和`read_line` 中,出现了地址 `0x603780`。对这两个函数逆向,大致如下: ```c @@ -300,7 +299,7 @@ char* read_line() { return start; } ``` -由此可知,以 `0x603870` 开头的字符串就是 phase 4 时输入的字符串,而在 phase 4 中恰好要输入两个整数,在它们之后再输入 `MrEvil`,我们就能够进入 Secret Phase。 +由此可知,以地址 `0x603870` 开头的字符串就是 Phase 4 时输入的字符串,而在 Phase 4 中恰好要输入两个整数,在它们之后再输入 `MrEvil`,我们就能够进入 Secret Phase。 ## Secret Phase ```c