使用 disas phase_4 查看phase_4的汇编代码
按照惯例,查看一下0x4025cf内存单元存放的字符串的值是什么
所以phase_4的输入应该是两个整数。
下面使用先猜想后验证的方法尝试找出两个整数的值,猜想两个整数为1,2,在ans.txt写入1,2(前面3行是前面3个phase的答案。)vim ans.txt
Border relations with Canada have never been better.
1 2 4 8 16 32
1 311
1 2
在phase_4的地方打上断点
(gdb) b phase_4
Breakpoint 1 at 0x40100c
使用ans.txt作为输入进行调试
(gdb) run ans.txt
Starting program: /root/CSAPP-Labs/labs/bomb/bomb ans.txt
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Welcome to my fiendish little bomb. You have 6 phases with
which to blow yourself up. Have a nice day!
Phase 1 defused. How about the next one?
That's number 2. Keep going!
Halfway there!Breakpoint 1, 0x000000000040100c in phase_4 ()
使用si以逐个指令的方式进入phase_4
注意进入scanf后需要输入finish跳出scanf,执行call 下一条指令。
打印$eax的值发现是2,所以cmp $0x2,%eax的作用是判断输入整数的个数是否是2,如果不是2,就跳到41行explode。
接下来比较0xe,和0x8(%rsp)的值。
可以使用p *(int *)($rsp+0x8)看到0x8(%rsp)存放第一个输入的数字。
之后,保存了一些变量之后进入fun4。直接使用finish跳出fun4。
test %eax,%eax判断%eax是否是0。
当第一个数为1时,%eax为0(瞎猜的),所以继续。
之后又比较0xc(%rsp)和0的大小,不相同时explode,所以第二个数为0。