Лаборатория бинарных бомб, фаза 2. Создание цикла из кода сборки - PullRequest
0 голосов
/ 03 марта 2019

У меня есть общее представление о фазе 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>, но я не могу точно определить точный алгоритм, который создает эту последовательность кода сборки.

...