试图拆除二元炸弹第 5 阶段 (phase_5)
trying to defuse Binary Bomb phase 5 (phase_5)
这似乎是一个非常受欢迎的问题,但我已经看了几个小时了,但我似乎无法解码它。我知道我需要查找 table 并以某种方式创建一个等效于 0x34 的六位数字符串,而且我输入字符串中的每个字符都与 0xf 进行 AND 运算,结果用于获取具有相应索引的字符从阵列。似乎找不到 6 个 suitable 字符来化解炸弹。
Dump of assembler code for function phase_5:
=> 0x08048dd5 <+0>: push %ebx
0x08048dd6 <+1>: sub [=11=]x14,%esp
0x08048dd9 <+4>: mov 0x1c(%esp),%ebx
0x08048ddd <+8>: push %ebx
0x08048dde <+9>: call 0x8049043 <string_length>
0x08048de3 <+14>: add [=11=]x10,%esp
0x08048de6 <+17>: cmp [=11=]x6,%eax
0x08048de9 <+20>: je 0x8048df0 <phase_5+27>
0x08048deb <+22>: call 0x8049159 <explode_bomb>
0x08048df0 <+27>: mov %ebx,%eax
0x08048df2 <+29>: add [=11=]x6,%ebx
0x08048df5 <+32>: mov [=11=]x0,%ecx
0x08048dfa <+37>: movzbl (%eax),%edx
0x08048dfd <+40>: and [=11=]xf,%edx
0x08048e00 <+43>: add 0x804a100(,%edx,4),%ecx
0x08048e07 <+50>: add [=11=]x1,%eax
0x08048e0a <+53>: cmp %ebx,%eax
0x08048e0c <+55>: jne 0x8048dfa <phase_5+37>
0x08048e0e <+57>: cmp [=11=]x34,%ecx
0x08048e11 <+60>: je 0x8048e18 <phase_5+67>
0x08048e13 <+62>: call 0x8049159 <explode_bomb>
0x08048e18 <+67>: add [=11=]x8,%esp
0x08048e1b <+70>: pop %ebx
0x08048e1c <+71>: ret
End of assembler dump.
(gdb)
(gdb) x/16dw 0x804a100
0x804a100 <array.3248>: 2 10 6 1
0x804a110 <array.3248+16>: 12 16 9 3
0x804a120 <array.3248+32>: 4 7 14 5
0x804a130 <array.3248+48>: 11 8 15 13
所以我需要创建一个六字符的字符串,相当于 0x34,即 52。
我使用 abcdef、ghijkl、mnopqr 作为测试字符串,同时使用 (gdb) info r 来观察程序循环时每个不同字符在寄存器 ecx 中的变化,例如。 a ->10, b ->6...
为了节省时间,我在 0x08048e07 处创建了一个断点。
然后我用 6 个字符加起来是 52。
例如。的解决方案是:
嗯嗯,
嗯嗯嗯
a=10 10
b=16 6
c=17 1
d=29 12
e=45 16
f=54 9
g=3 3
h=7 4
i=14 7
j=28 21
k=33 5
l=44 11
m=8 8
n=23 15
o=36 13
p=38 3
q=48 10
r=54 6
这似乎是一个非常受欢迎的问题,但我已经看了几个小时了,但我似乎无法解码它。我知道我需要查找 table 并以某种方式创建一个等效于 0x34 的六位数字符串,而且我输入字符串中的每个字符都与 0xf 进行 AND 运算,结果用于获取具有相应索引的字符从阵列。似乎找不到 6 个 suitable 字符来化解炸弹。
Dump of assembler code for function phase_5:
=> 0x08048dd5 <+0>: push %ebx
0x08048dd6 <+1>: sub [=11=]x14,%esp
0x08048dd9 <+4>: mov 0x1c(%esp),%ebx
0x08048ddd <+8>: push %ebx
0x08048dde <+9>: call 0x8049043 <string_length>
0x08048de3 <+14>: add [=11=]x10,%esp
0x08048de6 <+17>: cmp [=11=]x6,%eax
0x08048de9 <+20>: je 0x8048df0 <phase_5+27>
0x08048deb <+22>: call 0x8049159 <explode_bomb>
0x08048df0 <+27>: mov %ebx,%eax
0x08048df2 <+29>: add [=11=]x6,%ebx
0x08048df5 <+32>: mov [=11=]x0,%ecx
0x08048dfa <+37>: movzbl (%eax),%edx
0x08048dfd <+40>: and [=11=]xf,%edx
0x08048e00 <+43>: add 0x804a100(,%edx,4),%ecx
0x08048e07 <+50>: add [=11=]x1,%eax
0x08048e0a <+53>: cmp %ebx,%eax
0x08048e0c <+55>: jne 0x8048dfa <phase_5+37>
0x08048e0e <+57>: cmp [=11=]x34,%ecx
0x08048e11 <+60>: je 0x8048e18 <phase_5+67>
0x08048e13 <+62>: call 0x8049159 <explode_bomb>
0x08048e18 <+67>: add [=11=]x8,%esp
0x08048e1b <+70>: pop %ebx
0x08048e1c <+71>: ret
End of assembler dump.
(gdb)
(gdb) x/16dw 0x804a100
0x804a100 <array.3248>: 2 10 6 1
0x804a110 <array.3248+16>: 12 16 9 3
0x804a120 <array.3248+32>: 4 7 14 5
0x804a130 <array.3248+48>: 11 8 15 13
所以我需要创建一个六字符的字符串,相当于 0x34,即 52。 我使用 abcdef、ghijkl、mnopqr 作为测试字符串,同时使用 (gdb) info r 来观察程序循环时每个不同字符在寄存器 ecx 中的变化,例如。 a ->10, b ->6... 为了节省时间,我在 0x08048e07 处创建了一个断点。 然后我用 6 个字符加起来是 52。 例如。的解决方案是: 嗯嗯, 嗯嗯嗯
a=10 10
b=16 6
c=17 1
d=29 12
e=45 16
f=54 9
g=3 3
h=7 4
i=14 7
j=28 21
k=33 5
l=44 11
m=8 8
n=23 15
o=36 13
p=38 3
q=48 10
r=54 6