Linux 试图拆除二元炸弹第五阶段(第五阶段)

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>:

这似乎是一个非常流行的问题,但我已经看了几个小时了,我似乎无法破解它。我知道我需要一个查找表,并以某种方式创建一个相当于0x34的六位数字符串,而且输入字符串中的每个字符都与0xf进行and运算,结果用于从数组中获取具有相应索引的字符。只是似乎找不到6个合适的角色来解除炸弹

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