Bomblab Phase 5 - Как вы читаете команды mov с адреса? - PullRequest
0 голосов
/ 30 марта 2020

Хорошо, так что я сейчас решаю фазу 5 бомблаба (нам нужно прочитать код сборки и выяснить правильный ввод, чтобы "разрядить" бомбу). Для моей проблемы фазы 5 в качестве ответа требуются 2 цифры, поэтому я не смог найти много помощи в Интернете, поскольку большинство других проблем фазы 5 содержит строку из 6 символов. Вот мой дизассемблированный код:

phase_5:
  40108e:   48 83 ec 18           subq  $24, %rsp
  401092:   48 8d 4c 24 08        leaq  8(%rsp), %rcx  
  401097:   48 8d 54 24 0c        leaq  12(%rsp), %rdx
  40109c:   be 4f 25 40 00        movl  $4203855, %esi
  4010a1:   b8 00 00 00 00        movl  $0, %eax
  4010a6:   e8 f5 fa ff ff        callq -1291 <__isoc99_sscanf@plt>

  4010ab:   83 f8 01              cmpl  $1, %eax              
  4010ae:   7f 05                 jg    5 <phase_5+0x27> 
  4010b0:   e8 5a 03 00 00        callq 858 <explode_bomb>
  4010b5:   8b 44 24 0c           movl  12(%rsp), %eax 
  4010b9:   83 e0 0f              andl  $15, %eax 
  4010bc:   89 44 24 0c           movl  %eax, 12(%rsp) 
  4010c0:   83 f8 0f              cmpl  $15, %eax 
  4010c3:   74 2c                 je    44 <phase_5+0x63> 
  4010c5:   b9 00 00 00 00        movl  $0, %ecx 
  4010ca:   ba 00 00 00 00        movl  $0, %edx
  4010cf:   83 c2 01              addl  $1, %edx 
  4010d2:   48 98                 cltq
  4010d4:   8b 04 85 00 24 40 00  movl  4203520(,%rax,4), %eax #4*rax + 4203520 = new value address 
  4010db:   01 c1                 addl  %eax, %ecx 
  4010dd:   83 f8 0f              cmpl  $15, %eax 
  4010e0:   75 ed                 jne   -19 <phase_5+0x41> 
  4010e2:   89 44 24 0c           movl  %eax, 12(%rsp) 
  4010e6:   83 fa 0f              cmpl  $15, %edx 
  4010e9:   75 06                 jne   6 <phase_5+0x63> 
  4010eb:   3b 4c 24 08           cmpl  8(%rsp)
  4010ef:   74 05                 je    5 <phase_5+0x68>
  4010f1:   e8 19 03 00 00        callq 793 <explode_bomb>
  4010f6:   48 83 c4 18           addq  $24, %rsp
  4010fa:   c3                    retq

Вот код, когда я вызываю disass в gdb, чтобы вы могли ссылаться на адреса:


   0x000000000040108e <+0>: sub    $0x18,%rsp
   0x0000000000401092 <+4>: lea    0x8(%rsp),%rcx
   0x0000000000401097 <+9>: lea    0xc(%rsp),%rdx
   0x000000000040109c <+14>:    mov    $0x40254f,%esi
   0x00000000004010a1 <+19>:    mov    $0x0,%eax
   0x00000000004010a6 <+24>:    callq  0x400ba0 <__isoc99_sscanf@plt>
   0x00000000004010ab <+29>:    cmp    $0x1,%eax
   0x00000000004010ae <+32>:    jg     0x4010b5 <phase_5+39>
   0x00000000004010b0 <+34>:    callq  0x40140f <explode_bomb>
   0x00000000004010b5 <+39>:    mov    0xc(%rsp),%eax
   0x00000000004010b9 <+43>:    and    $0xf,%eax
   0x00000000004010bc <+46>:    mov    %eax,0xc(%rsp)
   0x00000000004010c0 <+50>:    cmp    $0xf,%eax
   0x00000000004010c3 <+53>:    je     0x4010f1 <phase_5+99>
   0x00000000004010c5 <+55>:    mov    $0x0,%ecx
   0x00000000004010ca <+60>:    mov    $0x0,%edx
   0x00000000004010cf <+65>:    add    $0x1,%edx
   0x00000000004010d2 <+68>:    cltq   
   0x00000000004010d4 <+70>:    mov    0x402400(,%rax,4),%eax
=> 0x00000000004010db <+77>:    add    %eax,%ecx
   0x00000000004010dd <+79>:    cmp    $0xf,%eax
   0x00000000004010e0 <+82>:    jne    0x4010cf <phase_5+65>
   0x00000000004010e2 <+84>:    mov    %eax,0xc(%rsp)
   0x00000000004010e6 <+88>:    cmp    $0xf,%edx
   0x00000000004010e9 <+91>:    jne    0x4010f1 <phase_5+99>
   0x00000000004010eb <+93>:    cmp    0x8(%rsp),%ecx
   0x00000000004010ef <+97>:    je     0x4010f6 <phase_5+104>
   0x00000000004010f1 <+99>:    callq  0x40140f <explode_bomb>
   0x00000000004010f6 <+104>:   add    $0x18,%rsp
   0x00000000004010fa <+108>:   retq   

Теперь я выяснил довольно много вещи, но у меня есть проблема с обратным проектированием одной части. Читая код, я знаю, что есть al oop, в котором% edx ведет себя как счетчик. Мы выходим из этого l oop, когда% eax имеет значение 15, и если после выхода из% edx нет значения 15, бомба взрывается. Если мне удастся пересечь этот взрыв, я также знаю, что мое второе значение задается регистром% ecx (командой je в конце). На каждой итерации l oop% eax обновляет свое значение с помощью этой команды:

movl    4203520(,%rax,4), %eax

Также, глядя на код, я знаю, что% eax устанавливается на первое значение ввода и затем мы делаем 15 & eax eax, который инициализирует% eax для l oop. Моя проблема сейчас в том, что я попытался просмотреть разные входные данные, и я не могу получить% edx больше 7. Я не понимаю, как перепроектировать вышеупомянутую команду перемещения, чтобы у меня было 15 итераций. Я чувствую, что у меня есть большинство частей ответа, но я не знаю, как обойти это, не пробуя каждый ввод (но нет предела, поэтому это невозможно).

Для тех, кто уже готово, бомба, это бомба25.

...