2026-03-03 完成 😄
1 | ❯ ./bomb ans.txt |
其中可以将答案写在文件里面,然后运行 ./bomb ans.txt,可以不用手动输入。
其次注意,必须在文件末尾留一个空行,不然会爆炸…
参考答案
我的一份答案 ans.txt
1 | Border relations with Canada have never been better. |
我的一份注释 https://gist.github.com/z0z0r4/32628db54848b181a0dc4b5a0347bd58
phase 1
0x402400 里面存了 Border relations with Canada have never been better.
这个字符串就是答案。
phase 2
读取六个数字,第一个数字必须为 1,然后要求前一个数字是后一个数字的两倍,即等比数列。
答案是 1 2 4 8 16 32。
phase 3
phase_3 读取两个数字到 %rcx 和 %rdx,要求 %rcx 即第一个数字的取值范围为 0~7,然后 jmp *0x402470(,%rax,8) 会按照下面的跳表,跳到 8 种 case。
1 | // 0x402470: 0x0000000000400f7c 0x0000000000400fb9 |
%rax = 0->0x400f7c%rax = 1->0x400fb9%rax = 2->0x400f83%rax = 3->0x400f8a%rax = 4->0x400f91%rax = 5->0x400f98%rax = 6->0x400f9f%rax = 7->0x400fa6
8 种 case 都是对 %eax 的赋值,以及跳转到再后面的代码
1 | // case 0 |
%rax = 0->0x400f7c-> 207%rax = 1->0x400fb9-> 311%rax = 2->0x400f83-> 707%rax = 3->0x400f8a-> 256%rax = 4->0x400f91-> 389%rax = 5->0x400f98-> 206%rax = 6->0x400f9f-> 682%rax = 7->0x400fa6-> 327
只要把上面对应的组合输入进去就是答案。
但我还是不知道标 unknown 的有什么用,没有看到跳转到 0x400fad 的,可能疏忽了
phase_3 注释
1 | 0000000000400f43 <phase_3>: |
phase 4
phase 4 给定 二分查找,用一个寄存器 %eax 就可以简单的记录数字树中的路径,向左则 %eax * 2,向右则 %eax * 2 + 1,*2 可以每跳转一次左移一位,最后递归结束后可以得到完整的路径(注意是调用递归后才记录,所以是倒序的,人得从右往左读)
phase 4 要求 %eax 初始化时 0,%eax 结果是 0,也就是一直向左,不向右 +1。
最后要求第二个数字是 0(但我没看懂为什么这里突兀的多这一步,和整个前面的没法衔接起来…)
phase_4 注释
1 | 0000000000400fce <func4>: |
phase 5
phase 5 读取六个字符的字符串,然后取每个字符的低四位(一个 char 有 8 位),四位的取值范围是 0~15,将字符映射到 0x4024b0 所存的 maduiersnfotvbylSo 的对应字符,然后要求最后结果拼起来是 0x40245e 对应的 flyers。
phase_5 注释
1 | 0000000000401062 <phase_5>: |
其中还有 canary,在 phase_5 的头尾,这些应该会在 attack lab 用到。
phase 6
phase 6 要求输入六个不重复、范围在 1~6 的数字,将其逐个 7 - n 映射下,然后按照映射后的数字来重新组合链表,结果要求链表必须是递减的。
我觉得逻辑不是很难,不像上面的进入树的痕迹记录那样的 trick 让我眼前一新(也是记住了),但跳转太多、指令太多了,花了不少时间。
1 |
|
secret phase
read_line会将输入都存入一个数组里
需要在 phase_4 的末尾增加一个 DrEvil 来触发 secret_phase。
secret_phase 要求传入一个数字,在给定的二叉树中查找这个数字,和 phase_4 一样记录痕迹,要求痕迹为 2(实际上就是 000…010)
只需要按照这个树找到任意符合的路径就可以了(左右/左右左)
答案可以是 20 和 22。
1 |
|
TODO
我希望在后续补充记录一些用到的 gdb 调试和寄存器、指令的内容,可能新开 post 或者以后再下面补充。
说些什么吧!