Понимание и перевод ассемблерного кода - PullRequest
0 голосов
/ 01 марта 2019

Итак, немного фона.Я начинающий с c и ассемблерным кодом, у нас есть назначение «бомба» (написанное на c), которое вызывает методы, которые требуют определенных паролей, но код не виден, и мне нужно определить правильный пароль, посмотрев на ассемблерный код.

Код указывает, что пароль для этого метода - 6 цифр, который передается как «ввод» в фазу метода 2 (я пытаюсь избежать запуска).

У меня проблемы с пониманиемчто здесь происходит, так что если кто-то может помочь мне перевести это на C-код, или если мне нужно просмотреть какие-либо конкретные регистры / местоположения, это очень поможет.Есть еще 4 этапа, каждый из которых должен быть более сложным, поэтому я хочу получить хорошее представление о том, как подходить к их чтению.

Также, если у кого-то есть хороший ресурс (например, таблица для печати) с кодом сборкиключевые слова, которые также были бы полезны, а также, если есть какие-либо различия между 32-битными и 64-битными регистрами, мне нужно беспокоиться не только об именах регистров.

(gdb) disas
Dump of assembler code for function phase_2:
   0x0000000000400f49 <+0>: push   %rbp
   0x0000000000400f4a <+1>: push   %rbx
   0x0000000000400f4b <+2>: sub    $0x28,%rsp
   0x0000000000400f4f <+6>: mov    %fs:0x28,%rax
   0x0000000000400f58 <+15>:    mov    %rax,0x18(%rsp)
   0x0000000000400f5d <+20>:    xor    %eax,%eax
   0x0000000000400f5f <+22>:    mov    %rsp,%rsi
   0x0000000000400f62 <+25>:    callq  0x401708 <read_six_numbers>
   0x0000000000400f67 <+30>:    cmpl   $0x0,(%rsp)
   0x0000000000400f6b <+34>:    jne    0x400f74 <phase_2+43>
   0x0000000000400f6d <+36>:    cmpl   $0x1,0x4(%rsp)
   0x0000000000400f72 <+41>:    je     0x400f79 <phase_2+48>
   0x0000000000400f74 <+43>:    callq  0x4016d2 <explode_bomb>
   0x0000000000400f79 <+48>:    mov    %rsp,%rbx
   0x0000000000400f7c <+51>:    lea    0x10(%rsp),%rbp
   0x0000000000400f81 <+56>:    mov    0x4(%rbx),%eax
   0x0000000000400f84 <+59>:    add    (%rbx),%eax
   0x0000000000400f86 <+61>:    cmp    %eax,0x8(%rbx)
   0x0000000000400f89 <+64>:    je     0x400f90 <phase_2+71>
=> 0x0000000000400f8b <+66>:    callq  0x4016d2 <explode_bomb>
   0x0000000000400f90 <+71>:    add    $0x4,%rbx
   0x0000000000400f94 <+75>:    cmp    %rbp,%rbx
   0x0000000000400f97 <+78>:    jne    0x400f81 <phase_2+56>
   0x0000000000400f99 <+80>:    mov    0x18(%rsp),%rax
   0x0000000000400f9e <+85>:    xor    %fs:0x28,%rax
   0x0000000000400fa7 <+94>:    je     0x400fae <phase_2+101>
   0x0000000000400fa9 <+96>:    callq  0x400b90 <__stack_chk_fail@plt>
   0x0000000000400fae <+101>:   add    $0x28,%rsp
   0x0000000000400fb2 <+105>:   pop    %rbx
   0x0000000000400fb3 <+106>:   pop    %rbp
   0x0000000000400fb4 <+107>:   retq   
End of assembler dump.

1 Ответ

0 голосов
/ 01 марта 2019

Ваша сборка эквивалентна этому, см. phase_2 функция

#include <stdio.h>

__attribute__((noinline)) void read_six_numbers(void *xxx, int *num)
{
    num[0] = 0;
    num[1] = 1;
    num[2] = 1;
    num[3] = 2;
    num[4] = 3;
    num[5] = 5;
}


__attribute__((noinline)) void explode_bomb()
{
    printf("explode_bomb.\n");
}

void phase_2(void *xxx)
{
    int num[6];
    int i;

    read_six_numbers(xxx, num);

    if (num[0] != 0 || num[1] != 1)
        explode_bomb();

    for (i = 0; i < 4; i++) {
        if (num[i] + num[i + 1] == num[i + 2])
            continue;

        explode_bomb();
    }
}

int main()
{
    phase_2(NULL);
    return 0;
}
...