Код переводится следующим образом:
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]
Как толькоС эквивалентом легко понять, как найти решение.