Хорошо, так что я сейчас решаю фазу 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.