aboutsummaryrefslogtreecommitdiff
path: root/bomblab/solution.md
diff options
context:
space:
mode:
authorov-4 <hausemasterstream@gmail.com>2026-01-15 14:24:15 +0000
committerov-4 <hausemasterstream@gmail.com>2026-01-15 14:24:15 +0000
commit24815f4b3f0990e811e7adf0492358e79933656d (patch)
tree676645136e594d82f442e42e8f7b658f1b203e27 /bomblab/solution.md
parentaccf7ec5273cb5a9ad6df17700593177724fc50b (diff)
Passed phase 4 LOL
Diffstat (limited to 'bomblab/solution.md')
-rw-r--r--bomblab/solution.md84
1 files changed, 83 insertions, 1 deletions
diff --git a/bomblab/solution.md b/bomblab/solution.md
index fb8afe5..267a50e 100644
--- a/bomblab/solution.md
+++ b/bomblab/solution.md
@@ -1,4 +1,17 @@
+## NB
+
+The default assembly codes are generated by GDB in runtime.
+
+Those generated by Objdump would be commited with `# OBJDUMP`
+
+If it's connected to a grading system (eg. when this app is sent by your professor)
+remember to set a breakpoint for ALL `<explode_bomb>`, so that your GPA won't be affected :)
+
+English version will be available soon
+
+
+# commands
`set disassembly-flavor att` nano ~/.gdbinit
@@ -83,10 +96,79 @@ int sscanf(const char *str, const char *format, ...);
之后找到cmp,答案就在寄存器里面
+# Phase 4
+
+func返回值需要是0,才能通关
+
+如果第一次就(mid <= input) 并且 (mid >= input),明显只有7满足,那就会直接返回0
+
+如果第一次不是7,那么要确保每次都走左边
+
+如果最深层的right - left = 1,那么range在400fe6为0,400fee操作之后也保持0
+
+最终最外层的func4也会返回0
+
+func4运行完之后还会检测第二个数字,别被坑了(第二个很简单的)
+
+```asm
+ 0x401048 <phase_4+003c> call 0x400fce <func4>
+ 0x40104d <phase_4+0041> test %eax, %eax
+ 0x40104f <phase_4+0043> jne 0x401058 <phase_4+76> TAKEN [Reason: !Z]
+ ↳ 0x401058 <phase_4+004c> call 0x40143a <explode_bomb>
+```
+```asm
+# OBJDUMP
+0000000000400fce <func4>:
+ 400fce: 48 83 ec 08 sub $0x8,%rsp
+
+ 400fd2: 89 d0 mov %right,%range
+ 400fd4: 29 f0 sub %left,%range
+ 400fd6: 89 c1 mov %range,%mid
+ 400fd8: c1 e9 1f shr $0x1f,%mid
+ 400fdb: 01 c8 add %mid,%range
+ 400fdd: d1 f8 sar $1,%range
+ 400fdf: 8d 0c 30 lea (%range,%left,1),%mid
+ 400fe2: 39 f9 cmp %input,%mid
+ # range = right - left
+ # mid = left + (range/2)
+
+
+ 400fe4: 7e 0c jle 400ff2 <func4+0x24> # if (mid > input), left part
+
+ # left part
+ # [left, mid-1]
+ 400fe6: 8d 51 ff lea -0x1(%mid),%right # right = mid - 1
+ 400fe9: e8 e0 ff ff ff call 400fce <func4>
+ 400fee: 01 c0 add %range,%range # range = 2 * range
+ 400ff0: eb 15 jmp 401007 <func4+0x39>
+
+ # right part
+ # [mid+1, right]
+ 400ff2: b8 00 00 00 00 mov $0x0,%range
+ 400ff7: 39 f9 cmp %input,%mid
+ 400ff9: 7d 0c jge 401007 <func4+0x39> # if (mid >= input) ret
+ 400ffb: 8d 71 01 lea 0x1(%mid),%left # left = mid + 1
+ 400ffe: e8 cb ff ff ff call 400fce <func4>
+ 401003: 8d 44 00 01 lea 0x1(%range,%range,1),%range # range = 2*range + 1
+
+ 401007: 48 83 c4 08 add $0x8,%rsp
+ 40100b: c3 ret # ret range (eax)
+
+
+# all caller saved
+# range --- eax
+# left --- esi
+# right --- edx
+# input --- rdi (constant)
+```
+
+
## Solution
Border relations with Canada have never been better.
1 2 4 8 16 32
-7 327 \ No newline at end of file
+7 327
+
+7 0 \ No newline at end of file