这是针对crackme问题的Ghidra反编译器输出。具体来说,这一个:
代码:
undefined8 entry(undefined8 param_1,char *param_2)
{
int iVar1;
size_t sVar2;
char *pcVar3;
char *pcVar4;
char local_118 [9];
char local_10f;
long local_10;
local_10 = *(long *)___stdinp;
_strcspn("Enter the password...\n",param_2);
_printf(local_118,0x100,*(undefined8 *)_fgets);
pcVar3 = "\n";
sVar2 = _strlen(local_118);
pcVar4 = local_118;
local_118[sVar2] = '\0';
iVar1 = dyld_stub_binder();
if (iVar1 == 10) {
if (local_118[0] == local_10f) {
_strcspn("Correct!\nthe password is: %s\n",local_118);
}
else {
_wrong_password(pcVar4,pcVar3);
}
}
else {
_wrong_password(pcVar4,pcVar3);
}
if (*(long *)___stdinp == local_10) {
return 0;
}
我在理解输出时遇到了一些麻烦。
- printf 和 strcspn 函数似乎被切换了?
- 该
local_10f变量从未初始化,但仍用于与密码进行比较。 - 我从阅读解决方案中知道,只要首尾字符相同,并且长度为10,那么密码就可以工作。“dyld_stub_binder”如何检查长度?在哪里比较第一个和最后一个字符?
谢谢你的帮助。