update bomblab

This commit is contained in:
18218461270@163.com 2025-08-02 16:10:31 +08:00
parent 84461d151d
commit 9aa52c7d76

View File

@ -1,4 +1,3 @@
# bomblab
输入命令 `objdump -s -S -d -M att bomb > bomb.s` 进行反汇编。 输入命令 `objdump -s -S -d -M att bomb > bomb.s` 进行反汇编。
## Phase 1 ## 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.` 显然,输入应为 `Border relations with Canada have never been better.`
## Phase 2 ## 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` 由此可知,输入应为 `1 2 4 8 16 32`
@ -205,11 +204,11 @@ void phase_5(char str[]) {
cmp $0x18,%rsi cmp $0x18,%rsi
jne .L1 jne .L1
``` ```
为了理解代码对以 `0x6032d0` 开头的一段内存的读取与写入,我们还需研究其中数据的组织方式,例如: 为了理解代码对以地址 `0x6032d0` 开头的一段内存的读写操作,我们还需研究其中数据的组织方式,例如:
```txt ```txt
6032d0 4c010000 01000000 e0326000 00000000 L........2`..... 6032d0 4c010000 01000000 e0326000 00000000 L........2`.....
``` ```
结合汇编代码,不难猜到这块区域依次存储了两个 `int` 和一个指针,组成一个结构。我们给出它的声明: 结合汇编代码,不难猜到这块区域依次存储了两个 4 字整数和一个指针,组成一个结构。我们给出它的声明:
```c ```c
struct chain_node { struct chain_node {
int val; int val;
@ -278,7 +277,7 @@ void phase_6(char str[]) {
结合链表知识,输入应为 `4 3 2 1 6 5` 结合链表知识,输入应为 `4 3 2 1 6 5`
## 进入 Secret Phase ## 进入 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`。对这两个函数逆向,大致如下: `0x603870` 这个地址并没有在其他任何地方出现过,但是在 `skip``read_line` 中,出现了地址 `0x603780`。对这两个函数逆向,大致如下:
```c ```c
@ -300,7 +299,7 @@ char* read_line() {
return start; return start;
} }
``` ```
由此可知,以 `0x603870` 开头的字符串就是 phase 4 时输入的字符串,而在 phase 4 中恰好要输入两个整数,在它们之后再输入 `MrEvil`,我们就能够进入 Secret Phase。 由此可知,以地址 `0x603870` 开头的字符串就是 Phase 4 时输入的字符串,而在 Phase 4 中恰好要输入两个整数,在它们之后再输入 `MrEvil`,我们就能够进入 Secret Phase。
## Secret Phase ## Secret Phase
```c ```c