Узлы связанных списков в сборке (Bomb Lab Phase 6) - PullRequest
0 голосов
/ 24 сентября 2019

Я изо всех сил пытаюсь выяснить, как сравниваются узлы с входными данными.До сих пор я мог различить, что для этого требуется шесть целых чисел, которые соответствуют узлам.Кроме того, числа не могут повторяться.

Я заметил, что $ rbx постоянно увеличивается на 8, и после осмотра я смог найти их:

0x6042e0 <node1>:       0x87    0x03    0x00 = 135
0x6042f0 <node2>:       0x92    0x02    0x00 = 146
0x604300 <node3>:       0x46    0x02    0x00 = 70
0x604310 <node4>:       0x1c    0x02    0x00 = 28
0x604320 <node5>:       0xf5    0x02    0x00 = 245
0x604330 <node6>:       0xc1    0x03    0x00 = 193

Я также понимаючто код использует цикл for для обхода связанного списка.Я просто не могу понять, какой тип операции / сравнения выполняется.

Вот сборка:

=> 0x00000000004010b0 <+0>:     push   %r13
   0x00000000004010b2 <+2>:     push   %r12
   0x00000000004010b4 <+4>:     push   %rbp
   0x00000000004010b5 <+5>:     push   %rbx
   0x00000000004010b6 <+6>:     sub    $0x58,%rsp
   0x00000000004010ba <+10>:    lea    0x30(%rsp),%rsi
   0x00000000004010bf <+15>:    callq  0x4014cb <read_six_numbers>
   0x00000000004010c4 <+20>:    lea    0x30(%rsp),%r12
   0x00000000004010c9 <+25>:    mov    $0x0,%r13d
   0x00000000004010cf <+31>:    mov    %r12,%rbp
   0x00000000004010d2 <+34>:    mov    (%r12),%eax
   0x00000000004010d6 <+38>:    sub    $0x1,%eax
   0x00000000004010d9 <+41>:    cmp    $0x5,%eax
   0x00000000004010dc <+44>:    jbe    0x4010e3 <phase_6+51>
   0x00000000004010de <+46>:    callq  0x401495 <explode_bomb>
   0x00000000004010e3 <+51>:    add    $0x1,%r13d
   0x00000000004010e7 <+55>:    cmp    $0x6,%r13d
   0x00000000004010eb <+59>:    je     0x40112a <phase_6+122>
   0x00000000004010ed <+61>:    mov    %r13d,%ebx
   0x00000000004010f0 <+64>:    movslq %ebx,%rax
   0x00000000004010f3 <+67>:    mov    0x30(%rsp,%rax,4),%eax
   0x00000000004010f7 <+71>:    cmp    %eax,0x0(%rbp)
   0x00000000004010fa <+74>:    jne    0x401101 <phase_6+81>
   0x00000000004010fc <+76>:    callq  0x401495 <explode_bomb>
   0x0000000000401101 <+81>:    add    $0x1,%ebx
   0x0000000000401104 <+84>:    cmp    $0x5,%ebx
   0x0000000000401107 <+87>:    jle    0x4010f0 <phase_6+64>
   0x0000000000401109 <+89>:    add    $0x4,%r12
   0x000000000040110d <+93>:    jmp    0x4010cf <phase_6+31>
   0x000000000040110f <+95>:    mov    0x8(%rdx),%rdx
   0x0000000000401113 <+99>:    add    $0x1,%eax
   0x0000000000401116 <+102>:   cmp    %ecx,%eax
   0x0000000000401118 <+104>:   jne    0x40110f <phase_6+95>
   0x000000000040111a <+106>:   mov    %rdx,(%rsp,%rsi,2)
   0x000000000040111e <+110>:   add    $0x4,%rsi
   0x0000000000401122 <+114>:   cmp    $0x18,%rsi
   0x0000000000401126 <+118>:   jne    0x40112f <phase_6+127>
   0x0000000000401128 <+120>:   jmp    0x401144 <phase_6+148>
   0x000000000040112a <+122>:   mov    $0x0,%esi
   0x000000000040112f <+127>:   mov    0x30(%rsp,%rsi,1),%ecx
   0x0000000000401133 <+131>:   mov    $0x1,%eax
   0x0000000000401138 <+136>:   mov    $0x6042e0,%edx
   0x000000000040113d <+141>:   cmp    $0x1,%ecx
   0x0000000000401140 <+144>:   jg     0x40110f <phase_6+95>
   0x0000000000401142 <+146>:   jmp    0x40111a <phase_6+106>
   0x0000000000401144 <+148>:   mov    (%rsp),%rbx
   0x0000000000401148 <+152>:   mov    %rsp,%rax
   0x000000000040114b <+155>:   lea    0x28(%rsp),%rsi
   0x0000000000401150 <+160>:   mov    %rbx,%rcx
   0x0000000000401153 <+163>:   mov    0x8(%rax),%rdx
   0x0000000000401157 <+167>:   mov    %rdx,0x8(%rcx)
   0x000000000040115b <+171>:   add    $0x8,%rax
   0x000000000040115f <+175>:   mov    %rdx,%rcx
   0x0000000000401162 <+178>:   cmp    %rsi,%rax
   0x0000000000401165 <+181>:   jne    0x401153 <phase_6+163>
   0x0000000000401167 <+183>:   movq   $0x0,0x8(%rdx)
   0x000000000040116f <+191>:   mov    $0x5,%ebp
   0x0000000000401174 <+196>:   mov    0x8(%rbx),%rax
   0x0000000000401178 <+200>:   mov    (%rax),%eax
   0x000000000040117a <+202>:   cmp    %eax,(%rbx)
   0x000000000040117c <+204>:   jge    0x401183 <phase_6+211>
   0x000000000040117e <+206>:   callq  0x401495 <explode_bomb>
   0x0000000000401183 <+211>:   mov    0x8(%rbx),%rbx
   0x0000000000401187 <+215>:   sub    $0x1,%ebp
   0x000000000040118a <+218>:   jne    0x401174 <phase_6+196>
   0x000000000040118c <+220>:   add    $0x58,%rsp
   0x0000000000401190 <+224>:   pop    %rbx
   0x0000000000401191 <+225>:   pop    %rbp
   0x0000000000401192 <+226>:   pop    %r12
   0x0000000000401194 <+228>:   pop    %r13
   0x0000000000401196 <+230>:   retq   

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 24 сентября 2019

Это происходит между 163 и 181?Просто пытаюсь найти начальную точку и направление движения в направлении.

Этот цикл читает линейно увеличивающиеся адреса (add $8, %rax), но записывает в y=*input++; x->next = y; x=y; или что-то в этом роде.Это может быть создание связанного списка из массива указателей?Странно.

В любом случае, ключевой особенностью цикла, который пересекает связанный список, является p = p->next. В asm ищите загрузку с режимом адресации, который включает регистр назначения .(Или иногда он может загружаться в другой регистр, а затем более поздние mov могут копировать обратно в тот же регистр.)

например, <+95>: mov 0x8(%rdx),%rdx выглядит как часть крошечного цикла, который выполняет шаги ECX вlist.

Затем после цикла он сохраняет последний указатель в массив в стеке?Идет индексация некоторого запутанного массива, где rsi увеличивается с add $4,%rsi, но используется для хранилища слов с масштабным коэффициентом 2 с mov %rdx,(%rsp,%rsi,2).

Я не проверял это, ноЯ подозреваю, что код проверяет вашу последовательность целых чисел путем «индексации» в связанном списке отдельно для каждого и записи того, какой элемент был достигнут после такого количества шагов.Затем запишите это в массив указателей, которые он будет использовать позже.

Поскольку связанные списки не являются структурами данных с произвольным доступом, индексирование с помощью целого числа означает зацикливание, которое много раз в цикле погони за указателем.Это объясняет цикл итераций связанного списка внутри цикла, в котором указатели хранятся в массиве.

Да, я думаю, это правильно.Есть возможное условие break внутри тела внешнего цикла, но в нижней части этого есть mov $0x6042e0,%edx, который снова помещает статический адрес (предположительно, первого узла) в RDX, и переходит обратно к вершине внутреннего цикла.

...