此代码将字符串的每个字符(位于ebp+arg_0
)与不同的常量(ASCII字符)进行比较,如'I‘、'o’和'S‘。我猜,基于其他代码部分,这段代码最初是用C语言编写的。
这个比较代码部分看起来非常低效。My think ,你认为这段代码在C中会是什么样子?最初使用的是什么代码构造?到目前为止我的想法
是的,这是挑战的一部分,我已经有了旗帜/解决方案,不用担心。只是想更好地理解代码。
发布于 2019-04-19 18:04:31
第一个参数(arg_0
)是指向给定密码字符串的指针,例如const char *arg_0
。该指针(第一个字符的地址)被加载到eax
寄存器(mov eax, [ebp+arg_0]
)中,然后添加当前字符的索引以将其前进到该索引(add eax, 4
等)。然后,该地址处的单字节被加载到eax
(movzx eax, byte ptr [eax]
)中。
然后将该字节/字符与正确的字节/字符(cmp eax, 'I'
等)进行比较。如果结果不为零(即,如果它们不相等),程序将跳转到“错误密码”分支(如果不是零,则为jnz
- jump ),否则将继续进行下一次比较(并最终成功)。
因此,最接近的直接C等价物应该是这样的:
void check(const char *arg_0) {
// presumably comparisons 0-3 are omitted
if (arg_0[4] != 'I') goto fail;
if (arg_0[5] != 'o') goto fail;
if (arg_0[6] != 'S') goto fail;
printf("Gratz man :)");
exit(0);
fail:
puts("Wrong password");
}
(当然,实际的C代码不太可能是这样的,因为goto fail
排列不是典型的。)
https://stackoverflow.com/questions/55759599
复制相似问题