Лаборатория Binary Bomb, фаза 9 - PullRequest
1 голос
/ 31 марта 2020

Я действительно застрял в Bomb Lab Phase 9 и искал несколько советов / предложений.

Вот мой код сборки:

Dump of assembler code for function phase_9:
   0x08048fc8 <+0>: push   %ebx
   0x08048fc9 <+1>: sub    $0x18,%esp
   0x08048fcc <+4>: movl   $0xa,0x8(%esp)
   0x08048fd4 <+12>: movl   $0x0,0x4(%esp)
   0x08048fdc <+20>: mov    0x20(%esp),%eax
   0x08048fe0 <+24>: mov    %eax,(%esp)
   0x08048fe3 <+27>: call   0x80488d0 <strtol@plt>
   0x08048fe8 <+32>: mov    %eax,%ebx
   0x08048fea <+34>: lea    -0x1(%eax),%eax
   0x08048fed <+37>: cmp    $0x3e8,%eax
   0x08048ff2 <+42>: jbe    0x8048ff9 <phase_9+49>
   0x08048ff4 <+44>: call   0x8049353 <explode_bomb>
   0x08048ff9 <+49>: mov    %ebx,0x4(%esp)
   0x08048ffd <+53>: movl   $0x804d0a0,(%esp)
   0x08049004 <+60>: call   0x8048f77 <fun9>
=> 0x08049009 <+65>: cmp    $0x7,%eax
   0x0804900c <+68>: je     0x8049013 <phase_9+75>
   0x0804900e <+70>: call   0x8049353 <explode_bomb>
   0x08049013 <+75>: add    $0x18,%esp
   0x08049016 <+78>: pop    %ebx
   0x08049017 <+79>: ret 

А вот код сборки для функции 9 внутри:

Dump of assembler code for function fun9:
   0x08048f77 <+0>: push   %ebx
   0x08048f78 <+1>: sub    $0x18,%esp
   0x08048f7b <+4>: mov    0x20(%esp),%edx
   0x08048f7f <+8>: mov    0x24(%esp),%ecx
   0x08048f83 <+12>: test   %edx,%edx
   0x08048f85 <+14>: je     0x8048fbe <fun9+71>
   0x08048f87 <+16>: mov    (%edx),%ebx
   0x08048f89 <+18>: cmp    %ecx,%ebx
   0x08048f8b <+20>: jle    0x8048fa0 <fun9+41>
   0x08048f8d <+22>: mov    %ecx,0x4(%esp)
   0x08048f91 <+26>: mov    0x4(%edx),%eax
   0x08048f94 <+29>: mov    %eax,(%esp)
   0x08048f97 <+32>: call   0x8048f77 <fun9>
   0x08048f9c <+37>: add    %eax,%eax
   0x08048f9e <+39>: jmp    0x8048fc3 <fun9+76>
   0x08048fa0 <+41>: mov    $0x0,%eax
   0x08048fa5 <+46>: cmp    %ecx,%ebx
   0x08048fa7 <+48>: je     0x8048fc3 <fun9+76>
   0x08048fa9 <+50>: mov    %ecx,0x4(%esp)
   0x08048fad <+54>: mov    0x8(%edx),%eax
   0x08048fb0 <+57>: mov    %eax,(%esp)
   0x08048fb3 <+60>: call   0x8048f77 <fun9>
   0x08048fb8 <+65>: lea    0x1(%eax,%eax,1),%eax
   0x08048fbc <+69>: jmp    0x8048fc3 <fun9+76>
   0x08048fbe <+71>: mov    $0xffffffff,%eax
=> 0x08048fc3 <+76>: add    $0x18,%esp
   0x08048fc6 <+79>: pop    %ebx
   0x08048fc7 <+80>: ret 

Вот что я знаю:

  • Это число больше 0
  • $eax внутри fun9 должно возвращать 7
  • $edx внутри fun9 имеет 75 внутри, и $ebx увеличивается / уменьшается в зависимости от того, меньше или больше входной номер 75
  • Вводимый номер должен избегать строки <+71> внутри fun9, потому что это перемещает число -1 внутри $eax, означающее, что оно никогда не сможет составить $eax = 7 (я могу ошибаться?), поскольку оно будет продолжать уменьшаться. Это также подразумевает, что $edx никогда не должно быть 0 для прохождения теста в строке <+12> внутри fun9

Все, что я пытался сделать, это проверять разные числа и отслеживать регистры внутри fun9, чтобы увидеть, как меняется $eax. Я думал, что ответ был 75, как это было внутри $edx, но это не так. Я знаю, что в этом тоже есть несколько рекурсивных вызовов - я пытаюсь найти вход, где $eax равно 7 к концу fun9.

Какие-нибудь советы о том, как я могу попытаться решить эту проблему? Есть ли какие-либо регистры, которые я пропускаю? Я смотрю на eax, ebx, ecx и edx.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...