2012-02-15 4 views
2

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

  1. Я понимаю cltq расширяет EAX (RAX) до 4 слов, но я не уверен, как это влияет на расчеты, а также не зная, что произойдет, если что строка ударяется несколько раз.
  2. фаза 5 + 82 -> phase5 + 65 (цикл?) Какие значения я пытаюсь начать с так, что ecx (rcx) может пройти окончательное сравнение?
  3. mov 0x402600 (,% rax, 4),% eax < - что делает эта линия точно? Пустой отбрасывает меня, пустой = 0?
  4. Любая другая помощь понимание того, что происходит и как я должен подойти выяснить, вход будет полезным, я попытался преобразовать это обратно в код 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<[email protected]> 
    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 
    
+0

Я смог решить проблему, главным образом, путем догадки и проверки. Ввод 5 для первого целого дал мне 15 в% edx на фазе_5 + 92, второе число используется только в фазе_5 + 97, посмотрев на% ecx с 5 в качестве первого входа, который я определил, быть 115. Однако то, что именно происходит в коде, до сих пор остается загадкой для меня ... – Gadesxion

ответ

4

код переводится на это:

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 является использование d, чтобы очистить 4 наиболее значительных байта rax, чтобы не мешать вычислению адреса в следующей инструкции. Это не влияет на расчет.

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

Да, это просто Mov DWord EAX, [0x402600 + 0 + Ракс * 4]

После того, как у вас есть C эквивалент, легко понять, как найти решение.

+0

Еще раз спасибо за вашу помощь Antoine – Gadesxion

+0

На какой строке в коде C есть «mov 0x402600 (,% rax, 4) % eax 'происходит? Также где значения в таблице, начиная с? – develop1

+0

@ develop1 Это _a = table [a]; _ Как указано в первой строке, массив _table_ находится в 0x402600. Однако эти данные не были предоставлены ОП. –

Смежные вопросы