2015-04-09 2 views
2

Хорошо, что это самая популярная бомбовая лаборатория, и я нахожусь в фазе 5, и я только застрял на двух строках. Вот код сборки:Язык ассемблера декодирования (Bomb Lab Phase 5)

Dump of assembler code for function phase_5: 
    0x08048e29 <+0>: push %ebx 
    0x08048e2a <+1>: sub $0x18,%esp 
    0x08048e2d <+4>: mov 0x20(%esp),%ebx 
    0x08048e31 <+8>: mov %ebx,(%esp) 
    0x08048e34 <+11>: call 0x804908b <string_length> 
    0x08048e39 <+16>: cmp $0x6,%eax 
    0x08048e3c <+19>: je  0x8048e43 <phase_5+26> 
    0x08048e3e <+21>: call 0x80493a5 <explode_bomb> 
    0x08048e43 <+26>: mov $0x0,%edx 
    0x08048e48 <+31>: mov $0x0,%eax 
    0x08048e4d <+36>: movzbl (%ebx,%eax,1),%ecx 
    0x08048e51 <+40>: and $0xf,%ecx 
    0x08048e54 <+43>: add 0x804a4a0(,%ecx,4),%edx 
    0x08048e5b <+50>: add $0x1,%eax 
    0x08048e5e <+53>: cmp $0x6,%eax 
    0x08048e61 <+56>: jne 0x8048e4d <phase_5+36> 
=> 0x08048e63 <+58>: cmp $0x42,%edx 
    0x08048e66 <+61>: je  0x8048e6d <phase_5+68> 
    0x08048e68 <+63>: call 0x80493a5 <explode_bomb> 
    0x08048e6d <+68>: add $0x18,%esp 
    0x08048e70 <+71>: pop %ebx 
    0x08048e71 <+72>: ret  
---Type <return> to continue, or q <return> to quit--- 
End of assembler dump. 

Вот скелетным взгляд, когда я запускаю его через декомпилятор:

void phase_5(__size8 *param1) { 
__size32 eax; // r24 
int eax_1; // r24{48} 
unsigned int ecx; // r25 
__size32 edx; // r26 
eax = string_length(param1); 
if (eax != 6) { 
explode_bomb(); 
} 
edx = 0; 
eax = 0; 
do { 
eax_1 = eax; 
ecx = *(unsigned char*)(param1 + eax_1); 
edx += array.3142[(ecx & 0xf)]; 
eax = eax_1 + 1; 
} while (eax_1 + 1 != 6); 
if (edx != 66) { 
explode_bomb(); 
} 
return; 
} 

Так общий краткий обзор этой фазы является то, что входная строка должна быть 6-ти символов, то он проходит через цикл do while, где он берет строку и превращает ее в число через свой алгоритм, а затем сравнивает ее, если в конце ее 66. Мои вопросы - вот что делают эти две линии:

ecx = (unsigned char) (param1 + eax_1); edx + = array.3142 [(ecx & 0xf)];

Более конкретно первый. Во второй строке & s значение первой строки с 15, которая по существу дает последние 4 бита ecx, но что делает добавление строки (param1) с счетчиком циклов (eax_1)? Также это строка, которая преобразует каждый символ в строку в число? Любая помощь будет принята с благодарностью!

ответ

5

Что делает добавление строки (param1) с помощью счетчика циклов (eax_1)?

Это просто индексирование массива. Он дает вам адрес соответствующего персонажа. ecx = *(unsigned char*)(param1 + eax_1) в основном ecx = param1[eax_1].

Как вы говорите, код проходит через все 6 букв, сохраняет низкие 4 бита кода ascii и использует это для индексации таблицы жесткого кодирования. Выбранные значения из таблицы поиска суммируются, и это ваш результат, который должен быть 0x42.

+0

А я вижу, так как же, когда я запускаю «kkkkkk», мне дают 30 вместо 66? Если бы я сделал математику, не должно ли это быть 11 + 11 + 11 ... 6 раз, так как двоичный код для k заканчивается в 1011, который равен 11. – Smreks

+0

О, подождите, я думаю, что я неправильно понял, вы имеете в виду, что у них есть свой собственный ascii код в массиве.3142, что означает, что у них есть свои собственные числовые значения для букв? – Smreks

+0

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