В «захвате 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