Понимание / расшифровка неясного кода сборки - PullRequest
2 голосов
/ 16 февраля 2012

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

  1. Я понимаю, что cltq расширяет eax (rax) до 4 слов, но я не уверен, как это влияет на вычисления, а также не уверен, что произойдет, если эта строка попадетнесколько раз.
  2. phase5 + 82 -> phase5 + 65 (цикл?) С каких значений я пытаюсь начать, чтобы ecx (rcx) мог пройти окончательное сравнение?
  3. mov 0x402600(,% rax, 4),% eax <- что именно делает эта строка? Пробел отбрасывает меня, пробел = 0? </li>
  4. Любая другая помощь, понимающая, что такое gи как мне следует подойти к выяснению ввода, было бы полезно, я попытался преобразовать это обратно в код C, как и предыдущие фазы

    0x00000000004010b4 <phase_5+0>:         sub    $0x18,%rsp
    0x00000000004010b8 <phase_5+4>:         lea    0x10(%rsp),%rcx
    0x00000000004010bd <phase_5+9>:         lea    0x14(%rsp),%rdx
    0x00000000004010c2 <phase_5+14>:        mov    $0x4026aa,%esi
    0x00000000004010c7 <phase_5+19>:        mov    $0x0,%eax
    0x00000000004010cc <phase_5+24>:        callq  0x400b80<sscanf@plt>
    0x00000000004010d1 <phase_5+29>:        cmp    $0x1,%eax
    0x00000000004010d4 <phase_5+32>:        jg     0x4010db<phase_5+39>
    0x00000000004010d6 <phase_5+34>:        callq  0x401421(explode_bomb)
    0x00000000004010db <phase_5+39>:        mov    0x14(%rsp),%eax
    0x00000000004010df <phase_5+43>:        and    $0xf,%eax
    0x00000000004010e2 <phase_5+46>:        mov    %eax,0x14(%rsp)
    0x00000000004010e6 <phase_5+50>:        cmp    $0xf,%eax
    0x00000000004010e9 <phase_5+53>:        je     0x40111b <phase_5+103>
    0x00000000004010eb <phase_5+55>:        mov    $0x0,%edx
    0x00000000004010f0 <phase_5+60>:        mov    $0x0,%ecx
    0x00000000004010f5 <phase_5+65>:        add    $0x1,%edx
    0x00000000004010f8 <phase_5+68>:        cltq   
    0x00000000004010fa <phase_5+70>:        mov    0x402600(,%rax,4),%eax
    0x0000000000401101 <phase_5+77>:        add    %eax,%ecx
    0x0000000000401103 <phase_5+79>:        cmp    $0xf,%eax
    0x0000000000401106 <phase_5+82>:        jne    0x4010f5 <phase_5+65>
    0x0000000000401108 <phase_5+84>:        movl   $0xf,0x14(%rsp)
    0x0000000000401110 <phase_5+92>:        cmp    $0xf,%edx
    0x0000000000401113 <phase_5+95>:        jne    0x40111b <phase_5+103>
    0x0000000000401115 <phase_5+97>:        cmp    %ecx,0x10(%rsp)
    0x0000000000401119 <phase_5+101>:       je     0x401120 <phase_5+108>
    0x000000000040111b <phase_5+103>:       callq  0x401421 <explode_bomb>
    0x0000000000401120 <phase_5+108>:       add    $0x18,%rsp
    0x0000000000401124 <phase_5+112>:       retq   
    

1 Ответ

4 голосов
/ 16 февраля 2012

Код переводится следующим образом:

0x402600: int table[15];
0x4026aa: const char *format;

void func (const char *str)
{
    int a, b, count, sum;

    if (sscanf (str, format, &a, &b) != 2) {
        explode_bomb();
    }

    a = a & 0xF;
    if (a == 0xF) {
        explode_bomb();
    }

    sum = 0;
    count = 0;
    while (a != 0xF) {
        a = table[a];
        sum += a;
        count++;
    }

    if ((count != 0xF) || (sum != b)) {
        explode_bomb ();
    }
}

Чтобы ответить на ваши конкретные вопросы:

cltq используется для очистки 4 старших значащих байтов rax, чтобы не мешать адресуРасчет в следующей инструкции.Это не влияет на вычисления.

mov 0x402600 (,% rax, 4),% eax <- что конкретно делает эта строка?Пробел отбрасывает меня, это пробел = 0? </p>

Да, это просто mov dword eax, [0x402600 + 0 + rax * 4]

Как толькоС эквивалентом легко понять, как найти решение.

...