bomblab
准备工作
- 首先我们将目标程序转换成汇编代码写入到bomb.txt方便查看
- 然后打开这个文件查看内容

phase_1

这里我们直接转换成伪c代码:
// 先将栈区减少8
esi = 0x402400;
strings_not_equal(rdi, rsi);
if (eax != 0) {
explode_bomb();
}
return;
// 恢复栈区
我们可以看到他把0x402400传入到一个strings_not_equal的函数了,那么里面肯定判断的是两个字符串是否相等,不相等就爆炸。所以我们输出0x402400位置的字符串即可。

第一题答案即为Border relations with Canada have never been better.

phase_2

这里我们直接转换成伪c代码:
// stack init
rsi = rbp;
read_six_numbers();
if (*rsp != 1) {
expoload_bomb();
}
rbx = rsp + 4;
rbp = rsp + 20;
400f17:
eax = *(rbx - 4);
eax = eax + eax;
if (*rbx != eax) {
expload_bomb();
}
rbx += 4;
if (rbx != rbp) {
jmp 400f17;
}
// stack init
首先我们在分析一下read_six_numbers():
我们发现esi中存的是0x4025c3,我们将这个内存地址指向的东西输出:

发现是六个数。
然后我们分析phase_2:
rbx是读入的第二个数,rbp是读入的最后一个数,首先我们判断读入的第一个数是否是1,如果不是爆炸,是的话我们比较后一项是否是前一项的两倍,如果不是也爆炸,所以最后我们得出的结果是:
- 一共六个数,读入的第一个数是1
- 每一个数是前面的数的两倍
即答案为1 2 4 8 16 32

phase_3
0000000000400f43 <phase_3>:
400f43: 48 83 ec 18 sub $0x18,%rsp
400f47: 48 8d 4c 24 0c lea 0xc(%rsp),%rcx
400f4c: 48 8d 54 24 08 lea 0x8(%rsp),%rdx
400f51: be cf 25 40 00 mov $0x4025cf,%esi
400f56: b8 00 00 00 00 mov $0x0,%eax
400f5b: e8 90 fc ff ff call 400bf0 <__isoc99_sscanf@plt>
400f60: 83 f8 01 cmp $0x1,%eax
400f63: 7f 05 jg 400f6a <phase_3+0x27>
400f65: e8 d0 04 00 00 call 40143a <explode_bomb>
400f6a: 83 7c 24 08 07 cmpl $0x7,0x8(%rsp)
400f6f: 77 3c ja 400fad <phase_3+0x6a>
400f71: 8b 44 24 08 mov 0x8(%rsp),%eax
400f75: ff 24 c5 70 24 40 00 jmp *0x402470(,%rax,8)
400f7c: b8 cf 00 00 00 mov $0xcf,%eax
400f81: eb 3b jmp 400fbe <phase_3+0x7b>
400f83: b8 c3 02 00 00 mov $0x2c3,%eax
400f88: eb 34 jmp 400fbe <phase_3+0x7b>
400f8a: b8 00 01 00 00 mov $0x100,%eax
400f8f: eb 2d jmp 400fbe <phase_3+0x7b>
400f91: b8 85 01 00 00 mov $0x185,%eax
400f96: eb 26 jmp 400fbe <phase_3+0x7b>
400f98: b8 ce 00 00 00 mov $0xce,%eax
400f9d: eb 1f jmp 400fbe <phase_3+0x7b>
400f9f: b8 aa 02 00 00 mov $0x2aa,%eax
400fa4: eb 18 jmp 400fbe <phase_3+0x7b>
400fa6: b8 47 01 00 00 mov $0x147,%eax
400fab: eb 11 jmp 400fbe <phase_3+0x7b>
400fad: e8 88 04 00 00 call 40143a <explode_bomb>
400fb2: b8 00 00 00 00 mov $0x0,%eax
400fb7: eb 05 jmp 400fbe <phase_3+0x7b>
400fb9: b8 37 01 00 00 mov $0x137,%eax
400fbe: 3b 44 24 0c cmp 0xc(%rsp),%eax
400fc2: 74 05 je 400fc9 <phase_3+0x86>
400fc4: e8 71 04 00 00 call 40143a <explode_bomb>
400fc9: 48 83 c4 18 add $0x18,%rsp
400fcd: c3 ret
这里我们直接转换成伪c代码:
// stack init
rcx = rsp + 12;
rdx = rsp + 8;
esi = 0x4025cf;
eax = 0;
__isoc99_sscanf@plt();
if (eax <= 1) {
expload_bomb();
}
if (*(rsp + 8) > 7) {
jmp 400fad;
}
eax = *(rsp + 8);
jmp *0x402470(, %rax, 8);
switch {
case 0:
eax = 0xcf;
break;
case 2:
eax = 0x2c3;
break;
case 3:
eax = 0x100;
break;
case 4:
eax = 0x185;
break;
case 5:
eax = 0xce;
break;
case 6:
eax = 0x2aa;
break;
case 7:
eax = 0x147;
break;
case 1:
eax = 0x137;
break;
}
400fad:
explode_bomb();
eax = 0;
if (eax != *(rsp +

本文详细分析了一个名为bomblab的爆破实验室,涉及字符串比较、数字序列、二分查找算法的运用。在phase_1中,找出0x402400位置的字符串;phase_2中,找到满足每个数是前一个数两倍的六位数序列;phase_3通过switch-case实现的二分查找,找出与输入匹配的数对;phase_4利用二分查找原理进行字符串匹配;最后在phase_6中,处理数字序列并确保它们满足特定条件。每个阶段都需要通过逻辑推理和计算来解密谜题。
最低0.47元/天 解锁文章
2221

被折叠的 条评论
为什么被折叠?



