Противоречивое утверждение в двух функциях? - PullRequest
0 голосов
/ 05 февраля 2019

В «захвате 1» мы видим, что требуется, чтобы на входе было больше единицы стрелкой, указывающей на строку <+61>, а метки «1-й» и «2-й» указывали, что два входаЭта проблема будет передана в функцию «func_switch».

С помощью оператора «mov» между двумя «func_switch» мы видим, что оператор «cmp», помеченный числом «2», будет сравниватьсязначение в "eax" и "ebx", которое "func_switch" предоставил в своем переключателе.Здесь мы должны иметь два значения в eax и ebx равными, чтобы избежать бомбы в строке <+90>.

Это означает, что нам нужно, чтобы два варианта были равны, чтобы коммутатор сохранял два одинаковыхзначение в двух регистрах.Тем не менее, это противоречит тому факту, что строки <+59> и <+61> требуют, чтобы два варианта ввода в func_switch не были равны друг другу.

Поэтому вполне естественно, что мы можем переполнитьсявторой вход, чтобы два входных фида в «func_switch» были равны в представлении «func_switch».

Однако, во вложении «capture 2», мы можем видеть, что требуется, чтобы входне больше 7 и не может быть отрицательным.

захват 1:

0x0000000000400fa6 <+0>:     push   %rbx
0x0000000000400fa7 <+1>:     sub    $0x10,%rsp
0x0000000000400fab <+5>:     movl   $0x0,0xc(%rsp)
0x0000000000400fb3 <+13>:    movl   $0x0,0x8(%rsp)
0x0000000000400fbb <+21>:    lea    0x8(%rsp),%rcx
0x0000000000400fc0 <+26>:    lea    0xc(%rsp),%rdx
0x0000000000400fc5 <+31>:    mov    $0x4031b1,%esi
0x0000000000400fca <+36>:    mov    $0x0,%eax
0x0000000000400fcf <+41>:    callq  0x400c10 <__isoc99_sscanf@plt>
0x0000000000400fd4 <+46>:    cmp    $0x1,%eax
0x0000000000400fd7 <+49>:    jle    0x400fe3 <phase_3+61>
0x0000000000400fd9 <+51>:    mov    0x8(%rsp),%eax
0x0000000000400fdd <+55>:    cmp    %eax,0xc(%rsp)
0x0000000000400fe1 <+59>:    jne    0x400fe8 <phase_3+66>
0x0000000000400fe3 <+61>:    callq  0x40163b <explode_bomb>
0x0000000000400fe8 <+66>:    mov    0xc(%rsp),%edi
0x0000000000400fec <+70>:    callq  0x400f59 <func_switch>
0x0000000000400ff1 <+75>:    mov    %eax,%ebx
0x0000000000400ff3 <+77>:    mov    0x8(%rsp),%edi
=>  0x0000000000400ff7 <+81>:    callq  0x400f59 <func_switch>
0x0000000000400ffc <+86>:    cmp    %eax,%ebx
0x0000000000400ffe <+88>:    je     0x401005 <phase_3+95>
0x0000000000401000 <+90>:    callq  0x40163b <explode_bomb>
0x0000000000401005 <+95>:    add    $0x10,%rsp
0x0000000000401009 <+99>:    pop    %rbx
0x000000000040100a <+100>:   retq

захват 2:

0x0000000000400f59 <+0>:     cmp    $0x7,%edi
0x0000000000400f5c <+3>:     ja     0x400f8b <func_switch+50>
0x0000000000400f5e <+5>:     mov    %edi,%edi
0x0000000000400f60 <+7>:     jmpq   *0x402a80(,%rdi,8)
0x0000000000400f67 <+14>:    mov    $0x68,%eax
0x0000000000400f6c <+19>:    retq
0x0000000000400f6d <+20>:    mov    $0x25d,%eax
0x0000000000400f72 <+25>:    retq
0x0000000000400f73 <+26>:    mov    $0x171,%eax
0x0000000000400f78 <+31>:    retq
0x0000000000400f79 <+32>:    mov    $0x2fc,%eax
0x0000000000400f7e <+37>:    retq
0x0000000000400f7f <+38>:    mov    $0x6c,%eax
0x0000000000400f84 <+43>:    retq
0x0000000000400f85 <+44>:    mov    $0xed,%eax
0x0000000000400f8a <+49>:    retq
0x0000000000400f8b <+50>:    sub    $0x8,%rsp
0x0000000000400f8f <+54>:    callq  0x40163b <explode_bomb>
0x0000000000400f94 <+59>:    mov    $0x0,%eax
0x0000000000400f99 <+64>:    jmp    0x400fa1 <func_switch+72>
0x0000000000400f9b <+66>:    mov    $0x201,%eax
0x0000000000400fa0 <+71>:    retq
0x0000000000400fa1 <+72>:    add    $0x8,%rsp
0x0000000000400fa5 <+76>:    retq
...