Linux 试图拆除二元炸弹第五阶段(第五阶段)
这似乎是一个非常流行的问题,但我已经看了几个小时了,我似乎无法破解它。我知道我需要一个查找表,并以某种方式创建一个相当于0x34的六位数字符串,而且输入字符串中的每个字符都与0xf进行and运算,结果用于从数组中获取具有相应索引的字符。只是似乎找不到6个合适的角色来解除炸弹Linux 试图拆除二元炸弹第五阶段(第五阶段),linux,binary,gdb,buffer,disassembly,Linux,Binary,Gdb,Buffer,Disassembly,这似乎是一个非常流行的问题,但我已经看了几个小时了,我似乎无法破解它。我知道我需要一个查找表,并以某种方式创建一个相当于0x34的六位数字符串,而且输入字符串中的每个字符都与0xf进行and运算,结果用于从数组中获取具有相应索引的字符。只是似乎找不到6个合适的角色来解除炸弹 Dump of assembler code for function phase_5: => 0x08048dd5 <+0>: push %ebx 0x08048dd6 <+1>:
Dump of assembler code for function phase_5:
=> 0x08048dd5 <+0>: push %ebx
0x08048dd6 <+1>: sub $0x14,%esp
0x08048dd9 <+4>: mov 0x1c(%esp),%ebx
0x08048ddd <+8>: push %ebx
0x08048dde <+9>: call 0x8049043 <string_length>
0x08048de3 <+14>: add $0x10,%esp
0x08048de6 <+17>: cmp $0x6,%eax
0x08048de9 <+20>: je 0x8048df0 <phase_5+27>
0x08048deb <+22>: call 0x8049159 <explode_bomb>
0x08048df0 <+27>: mov %ebx,%eax
0x08048df2 <+29>: add $0x6,%ebx
0x08048df5 <+32>: mov $0x0,%ecx
0x08048dfa <+37>: movzbl (%eax),%edx
0x08048dfd <+40>: and $0xf,%edx
0x08048e00 <+43>: add 0x804a100(,%edx,4),%ecx
0x08048e07 <+50>: add $0x1,%eax
0x08048e0a <+53>: cmp %ebx,%eax
0x08048e0c <+55>: jne 0x8048dfa <phase_5+37>
0x08048e0e <+57>: cmp $0x34,%ecx
0x08048e11 <+60>: je 0x8048e18 <phase_5+67>
0x08048e13 <+62>: call 0x8049159 <explode_bomb>
0x08048e18 <+67>: add $0x8,%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
功能阶段_5的汇编程序代码转储:
=>0x08048dd5:推送%ebx
0x0804846:sub$0x14,%esp
0x08048dd9:mov 0x1c(%esp),%ebx
0x080484ddd:推送%ebx
0x08048dde:调用0x8049043
0x08048de3:添加$0x10,%esp
0x08048de6:cmp$0x6,%eax
0x08048de9:je 0x8048df0
0x08048deb:调用0x8049159
0x08048df0:mov%ebx,%eax
0x08048df2:添加$0x6,%ebx
0x08048df5:mov$0x0,%ecx
0x08048dfa:movzbl(%eax),%edx
0x08048dfd:和$0xf,%edx
0x08048e00:添加0x804a100(,%edx,4),%ecx
0x08048e07:添加$0x1,%eax
0x08048e0a:cmp%ebx,%eax
0x08048e0c:jne 0x8048dfa
0x08048e0e:cmp$0x34,%ecx
0x08048e11:je 0x8048e18
0x08048e13:呼叫0x8049159
0x08048e18:添加$0x8,%esp
0x08048e1b:弹出%ebx
0x08048e1c:ret
汇编程序转储结束。
(gdb)
(gdb)x/16dw 0x804a100
0x804a100:2106 1
0x804a110:12 16 9 3
0x804a120:4 7 14 5
0x804a130:11 8 15 13
所以我需要创建一个六个字符的字符串,相当于0x34,即52。
我使用abcdef、ghijkl、mnopqr作为测试字符串,同时使用(gdb)info r观察程序循环时每个不同字符的寄存器ecx的变化,例如a->10、b->6。。。
为了节省时间,我在0x08048e07创建了一个断点。
然后我用6个字符加起来就是52个。
解决方案包括:
dmmmmm,
嗯
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