Массивы в x86-64 - PullRequest
       31

Массивы в x86-64

1 голос
/ 10 апреля 2020

Хорошо, у меня есть приличное понимание того, что здесь происходит. Я ввожу 6 символов символов, и предполагается, что он равен $ 0x3a, что составляет 58. Таким образом, массив проходит через каждый символ и выполняет & с $ 0xf, равным 15. Тогда я не получаю то, что он делает в строке 39. Например, если я ввожу b, а затем делаю & 0xf для него, он становится равным 2, после строки 39% ecx становится равным 6, и я не знаю, как выполняется этот расчет. Я думал, что строка 39: x + 4y, так что% rsi + (% rdx * 4). Кто-нибудь знает, что именно происходит в строке 39?

Dump of assembler code for function phase_5:
0x000055555555547d <+0>:     push   %rbx
0x000055555555547e <+1>:     mov    %rdi,%rbx
0x0000555555555481 <+4>:     callq  0x5555555556fe <string_length>
0x0000555555555486 <+9>:     cmp    $0x6,%eax
0x0000555555555489 <+12>:    jne    0x5555555554bc <phase_5+63>
0x000055555555548b <+14>:    mov    %rbx,%rax
0x000055555555548e <+17>:    lea    0x6(%rbx),%rdi
0x0000555555555492 <+21>:    mov    $0x0,%ecx
0x0000555555555497 <+26>:    lea    0x1622(%rip),%rsi        # 0x555555556ac0 <array.3416>
0x000055555555549e <+33>:    movzbl (%rax),%edx
0x00005555555554a1 <+36>:    and    $0xf,%edx
0x00005555555554a4 <+39>:    add    (%rsi,%rdx,4),%ecx
0x00005555555554a7 <+42>:    add    $0x1,%rax
0x00005555555554ab <+46>:    cmp    %rdi,%rax
0x00005555555554ae <+49>:    jne    0x55555555549e <phase_5+33>
0x00005555555554b0 <+51>:    cmp    $0x3a,%ecx
0x00005555555554b3 <+54>:    je     0x5555555554ba <phase_5+61>
0x00005555555554b5 <+56>:    callq  0x555555555a14 <explode_bomb>
0x00005555555554ba <+61>:    pop    %rbx
0x00005555555554bb <+62>:    retq
0x00005555555554bc <+63>:    callq  0x555555555a14 <explode_bomb>
0x00005555555554c1 <+68>:    jmp    0x55555555548b <phase_5+14>

1 Ответ

0 голосов
/ 11 апреля 2020

Массив 'array.3416' содержит 16 4-байтовых значений.
Введенные вами буквы (их правильный шестнадцатеричный ди git) используются в качестве индекса в этом массиве.

index может иметь 16 возможных значений индекса: 0 .. 15.
Операция and в строке 36 принимает самый правый шестнадцатеричный ди git введенного символа (код ASCII & 0xF: '@' => 0, 'A' => 1, 'B' => 2, ..., 'O' => 15, 'P' => 0, 'Q' => 1, ...).

Затем он выбирает соответствующее значение из массива и одновременно суммирует (в строке 39) все 6 значений массива, по одному для каждой буквы пароля путем цикла.

...