双元炸弹-第 6 阶段

Binary bomb- phase 6

这是phase_6的反汇编:

 08048dbf <phase_6>:
 8048dbf:   55                      push   %ebp
 8048dc0:   89 e5                   mov    %esp,%ebp
 8048dc2:   83 ec 18                sub    [=10=]x18,%esp
 8048dc5:   c7 44 24 0c 00 00 00    movl   [=10=]x0,0xc(%esp)
 8048dcc:   00 
 8048dcd:   c7 44 24 08 0a 00 00    movl   [=10=]xa,0x8(%esp)
 8048dd4:   00 
 8048dd5:   c7 44 24 04 00 00 00    movl   [=10=]x0,0x4(%esp)
 8048ddc:   00 
 8048ddd:   8b 45 08                mov    0x8(%ebp),%eax
 8048de0:   89 04 24                mov    %eax,(%esp)
 8048de3:   e8 0c fa ff ff          call   80487f4 <__strtol_internal@plt>
 8048de8:   a3 4c b5 04 08          mov    %eax,0x804b54c
 8048ded:   c7 04 24 4c b5 04 08    movl   [=10=]x804b54c,(%esp)
 8048df4:   e8 76 ff ff ff          call   8048d6f <fun6>
 8048df9:   ba 01 00 00 00          mov    [=10=]x1,%edx
 8048dfe:   8b 40 08                mov    0x8(%eax),%eax
 8048e01:   42                      inc    %edx //HERE
 8048e02:   83 fa 06                cmp    [=10=]x6,%edx//HERE
 8048e05:   7e f7                   jle    8048dfe <phase_6+0x3f>
 8048e07:   8b 00                   mov    (%eax),%eax
 8048e09:   3b 05 4c b5 04 08       cmp    0x804b54c,%eax
 8048e0f:   74 05                   je     8048e16 <phase_6+0x57>
 8048e11:   e8 2d 06 00 00          call   8049443 <explode_bomb>
 8048e16:   c9                      leave  
 8048e17:   c3                      ret

以及fun6的分解:

 08048d6f <fun6>:
 8048d6f:   55                      push   %ebp
 8048d70:   89 e5                   mov    %esp,%ebp
 8048d72:   56                      push   %esi
 8048d73:   53                      push   %ebx
 8048d74:   8b 75 08                mov    0x8(%ebp),%esi
 8048d77:   8b 5e 08                mov    0x8(%esi),%ebx
 8048d7a:   c7 46 08 00 00 00 00    movl   [=11=]x0,0x8(%esi)
 8048d81:   85 db                   test   %ebx,%ebx
 8048d83:   74 34                   je     8048db9 <fun6+0x4a>
 8048d85:   89 f2                   mov    %esi,%edx
 8048d87:   89 f1                   mov    %esi,%ecx
 8048d89:   85 f6                   test   %esi,%esi
 8048d8b:   74 15                   je     8048da2 <fun6+0x33>
 8048d8d:   8b 06                   mov    (%esi),%eax
 8048d8f:   3b 03                   cmp    (%ebx),%eax
 8048d91:   7e 0f                   jle    8048da2 <fun6+0x33>
 8048d93:   89 d1                   mov    %edx,%ecx
 8048d95:   8b 52 08                mov    0x8(%edx),%edx
 8048d98:   85 d2                   test   %edx,%edx
 8048d9a:   74 06                   je     8048da2 <fun6+0x33>
 8048d9c:   8b 02                   mov    (%edx),%eax
 8048d9e:   3b 03                   cmp    (%ebx),%eax
 8048da0:   7f f1                   jg     8048d93 <fun6+0x24>
 8048da2:   39 d1                   cmp    %edx,%ecx
 8048da4:   74 05                   je     8048dab <fun6+0x3c>
 8048da6:   89 59 08                mov    %ebx,0x8(%ecx)
 8048da9:   eb 02                   jmp    8048dad <fun6+0x3e>
 8048dab:   89 de                   mov    %ebx,%esi
 8048dad:   8b 4b 08                mov    0x8(%ebx),%ecx
 8048db0:   89 53 08                mov    %edx,0x8(%ebx)
 8048db3:   89 cb                   mov    %ecx,%ebx
 8048db5:   85 c9                   test   %ecx,%ecx
 8048db7:   75 cc                   jne    8048d85 <fun6+0x16>
 8048db9:   89 f0                   mov    %esi,%eax
 8048dbb:   5b                      pop    %ebx
 8048dbc:   5e                      pop    %esi
 8048dbd:   5d                      pop    %ebp
 8048dbe:   c3                      ret

我知道这个阶段是一个链表,但我不确定要使用多少个输入。我在phase_6中指出的两个地方让我认为需要有6个输入,但是有9个节点看起来像这样:

0x804b510 <node5>:      0x000003e3      0x00000005      0x804b528   (995)
0x804b528 <node3>:      0x000003d2      0x00000003      0x0804b51c  (978)   
0x804b51c <node4>:      0x00000365      0x00000004      0x0804b504  (869) 
0x804b504 <node6>:      0x000002ff      0x00000006      0x0804b4e0  (767)
0x804b4e0 <node9>:      0x00000280      0x00000009      0x0804b534  (640)            
0x804b534 <node2>:      0x000001b6      0x00000002      0x0804b4f8  (438)
0x804b4f8 <node7>:      0x00000106      0x00000007      0x0804b540  (262)
0x804b540 <node1>:      0x000000c6      0x00000001      0x0804b4ec  (198)
0x804b4ec <node8>:      0x00000052      0x00000008      0x0804b54c  (82)

其中括号中的数字是第一列数字的十六进制到十进制的转换。对我来说特别的是这些节点似乎是按降序排列的。我试过输入 5 3 4 6 9 2 7 1 8 没用(也反了)。

我的问题是我如何知道预期有多少输入?我相信是6,但为什么会有9个节点?

只有 1 个输入,这在 8048de3 的单个 strtol 调用中应该很明显。列表中的节点数与输入数无关。

因为你只问了输入的数量,所以我只回答了这个问题。