在线浏览: https://blog.w1ndys.top/posts/65c6afd7

主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int __fastcall main(int argc, const char **argv, const char **envp)
{
int v3; // ebx
int v4; // ebx
char v6[80]; // [rsp+10h] [rbp-50h] BYREF

printf("Whats the password: ");
__isoc99_scanf("%s", v6);
v3 = check1(v6);
v4 = check2(v6) * v3;
if ( (int)(v4 * check3(v6)) <= 0 )
puts("Nope, try again.");
else
puts("Correct!");
return 0;
}

check1()

1
2
3
4
5
6
7
8
9
10
11
__int64 __fastcall check1(const char *a1)
{
int i; // [rsp+1Ch] [rbp-14h]

for ( i = 0; i < strlen(a1); ++i )
{
if ( a1[i] <= 47 || a1[i] > 57 )
return 0LL;
}
return 1LL;
}

image-20240418184759191

check1() 函数检查输入的密码是否全部为数字。

check2()

1
2
3
4
5
6
7
8
9
10
11
12
13
__int64 __fastcall check2(const char *a1)
{
char v2; // [rsp+18h] [rbp-18h]
int i; // [rsp+1Ch] [rbp-14h]

v2 = 0;
for ( i = 0; i < strlen(a1) - 1; ++i )
v2 += a1[i];
if ( (v2 & 1) != 0 )
return 0xFFFFFFFFLL;
else
return 1LL;
}

image-20240418184834522

check2() 函数检查输入的密码,除去最后一位之后前面的和是不是偶数。

check3()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__int64 __fastcall check3(const char *a1)
{
int v2; // ebx
int i; // [rsp+1Ch] [rbp-14h]

if ( (strlen(a1) & 1) != 0 || strlen(a1) <= 4 )
return 0LL;
for ( i = 0; i < strlen(a1) >> 1; ++i )
{
v2 = a1[i];
if ( v2 != a1[i + (strlen(a1) >> 1)] + 4 )
return 0LL;
}
return 1LL;
}

image-20240418184846492

check3() 函数检查输入的密码,前半部分是否等于后半部分加 4。

总结

本次实验中,我们实现了三个密码检查函数,分别是 check1()、check2() 和 check3()。check1() 函数检查输入的密码是否全部为数字,check2() 函数检查输入的密码,除去最后一位之后前面的和是不是偶数,check3() 函数检查输入的密码,前半部分是否等于后半部分加 4。

所以输入密码符合前面提到的三个情况即可