Язык ассемблера декодирования (Bomb Lab Phase 5)
Хорошо, так что это очень популярная бомбовая лаборатория, и я в настоящее время на 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 =(без знака) (param1 + eax_1); edx + = array.3142 [(ecx & 0xf)];
Точнее первый. Вторая строка - это значение первой строки с 15, которая, по сути, дает последние 4 бита ecx, но что делает добавление строки (param1) со счетчиком цикла (eax_1)? Также это строка, которая преобразует каждый символ в строке в число? Любая помощь будет принята с благодарностью!