|
|
- ### 1. 使用 objdump 反编译 bomb
-
- ```objdump -d bomb > bomb.s```
-
- ### 2. 查找 main 函数
-
- 发现调用了函数 phase_1, phase_2 等等函数
-
- 猜测这些函数即用来验证输入字符串的正确性
-
- ### 3. 查看函数 phase_1
-
- 发现调用了函数 strings_not_equal
-
- 并且在调用之前为 %esi 赋值 0x402400
-
- 说明将其作为参数传进然后作为验证
-
- 猜测其为所需字符串的地址
-
- ### 4. 使用 gdb 查看字符串
-
- 为函数 phase_1 设置断点 ```break phase_1```
-
- 打印地址处字符串 ```print (char *) 0x402400```
-
- 得到 phase1
-
- ### 5. 查看函数 phase_2
-
- 发现调用函数 read_six_numbers
-
- 说明输入需要 6 个数字
-
- 查看后续汇编代码发现进行了循环控制
-
- 根据汇编代码得到 6 个数字
-
- 由于输入函数用的是 scanf,故不用考虑转为字符,直接输入 6 个数字
-
- 得到 phase2
-
- ### 6. 查看函数 phase_3
-
- 发现调用了 scanf 函数
-
- 观察参数寄存器 %rcx, %rdx, %rsi
-
- 使用 gdb 知需要输入两个数字
-
- cmpl 得知第一个数字需要小于 0x7
-
- 使用 gdb 观察间接跳转指令 jmpq
-
- 指向后面的 switch 控制流
-
- 从而得知输入的两个数字相关联
-
- 即本题多解
-
- 得到其中一个 phase3
-
- ### 7. 查看函数 phase_4
-
- 与 phase_3 同样的输入
-
- 第一个数字小于等于 0xe
-
- 发现调用 func4 且返回值需为 0
-
- 观察调用后代码发现第二个数为 0
-
- 观察 func4 发现第一个数需为 7
-
- 得到 phase4
-
- ### 8. 查看函数 phase_5
-
- 需输入字符串
-
- 循环根据输入字符串的 asc 值的第四位索引内置的字符串
-
- 用 gdb 查看最后得到的字符串是 flyers
-
- 得到 phase_5
-
- ### 9. 查看函数 phase_6
-
- 调用函数 read_six_numbers 知需输入 6 个数字
-
- 第一个循环说明每个数字需互不相同且小于等于 6
-
- 第二个循环对每个数字作 7 - x
-
- 第三个循环根据数字得到 6 个相当于链表的地址
-
- 第四个循环改变链表顺序
-
- 第五个循环说明得到的 6 个地址指向的数字需大于等于下一个地址指向的数字
-
- 得到 phase_6
-
- **注意:0x30和0x40相差16而不是10!!**
|