У меня есть общее представление о фазе 2 для проекта бинарной бомбы, но я не могу проработать технические детали.После добавления точки останова GDB для остановки выполнения при достижении phase_2
разборка (команда Linux disas
) выдает:
Dump of assembler code for function phase_2:
=> 0x000000000040109f <+0>: push %rbp
0x00000000004010a0 <+1>: push %rbx
0x00000000004010a1 <+2>: sub $0x28,%rsp
0x00000000004010a5 <+6>: mov %rsp,%rsi
0x00000000004010a8 <+9>: callq 0x401445 <read_six_numbers>
0x00000000004010ad <+14>: cmpl $0x1,(%rsp)
0x00000000004010b1 <+18>: je 0x4010b8 <phase_2+25>
0x00000000004010b3 <+20>: callq 0x40140f <explode_bomb>
0x00000000004010b8 <+25>: mov %rsp,%rbp
0x00000000004010bb <+28>: lea 0x4(%rsp),%rbx
0x00000000004010c0 <+33>: add $0x18,%rbp
0x00000000004010c4 <+37>: mov -0x4(%rbx),%eax
0x00000000004010c7 <+40>: add %eax,%eax
0x00000000004010c9 <+42>: cmp %eax,(%rbx)
0x00000000004010cb <+44>: je 0x4010d2 <phase_2+51>
0x00000000004010cd <+46>: callq 0x40140f <explode_bomb>
0x00000000004010d2 <+51>: add $0x4,%rbx
0x00000000004010d6 <+55>: cmp %rbp,%rbx
0x00000000004010d9 <+58>: jne 0x4010c4 <phase_2+37>
0x00000000004010db <+60>: add $0x28,%rsp
0x00000000004010df <+64>: pop %rbx
0x00000000004010e0 <+65>: pop %rbp
0x00000000004010e1 <+66>: retq
End of assembler dump.
Для целей тестирования я ввел 1 2 3 4 5 6
для второй фазы.Я вижу, что сравнение по адресу памяти 0x00000000004010ad
<+14> сравнивает значение 1 с первым целочисленным значением, сгенерированным из read_six_numbers()
, который в данном случае равен единице, а затем перепрыгивает через explode_bomb()
после того, как сравнение приводит кверное утверждение.Кроме того, значение 1 добавляется к себе по адресу памяти 0x00000000004010c7
<+40>.После этого единственное, что я могу ясно видеть, это то, что это цикл, который отправляется обратно по адресу 0x00000000004010c4
<+37>, но я не могу точно определить точный алгоритм, который создает эту последовательность кода сборки.