又他妈的是新生赛,我都不是新生了还天天被折磨。
首先查壳分析,然后反编译程序,可以看到程序逻辑还是比较简单的
我们进行一下整理和重命名,可以得到完整的程序逻辑:
int __cdecl main(int argc, const char **argv, const char **envp)
{int v3; // esichar v5[15]; // [esp+8h] [ebp-74h] BYREFchar v6[100]; // [esp+18h] [ebp-64h] BYREFprintf(&unk_40E140);scanf("%s", v6);memset(v5, 0, sizeof(v5));base_64(v6, strlen(v6), v5);v3 = 0;while ( v5[v3] == byte_40E0E4[v3] ){if ( ++v3 > strlen(v5) )goto LABEL_6;}printf(aError);
LABEL_6:if ( v3 - 1 == strlen(byte_40E0E4) )return printf(aAreYouHappyYes);elsereturn printf(aAreYouHappyNo);
}
大概就是读取一个我们的输入,然后将其进行base64
转换(为什么是Base64的转换,因为我用AI搜的),得到加密后的字符zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9
,我们使用正常的BASE64无法解密。
说明此时,加密逻辑进行了一定的修改,我们进入可以看到其加密逻辑
首先开头一个sub_401000()
函数,感觉肯定有问题啊,我们跟进查看
int sub_401000()
{int result; // eaxchar v1; // clfor ( result = 6; result < 15; ++result ){v1 = byte_40E0AA[result];byte_40E0AA[result] = byte_40E0A0[result];byte_40E0A0[result] = v1;}return result;
}
查看数组的内容和程序的逻辑,大概就是对原来的Base64解密进行了一个换表的操作,也就是将"HIJKLMNO"和"QRSTUVWXYZ"进行了新的交换。我们拿到新的字符表ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/=
,我们将加密数据和字符表拿到Cyberchef发现还是解不出来,继续往下看,看到最后return了一个sub_401030
函数,进去查看其函数逻辑,发现有一个大小写转换的操作:
int __cdecl sub_401030(const char *a1)
{__int64 v1; // raxchar v2; // alv1 = 0i64;if ( strlen(a1) ){do{v2 = a1[HIDWORD(v1)];if ( v2 < 97 || v2 > 122 ){if ( v2 < 65 || v2 > 90 )goto LABEL_9;LOBYTE(v1) = v2 + 32;}else{LOBYTE(v1) = v2 - 32;}a1[HIDWORD(v1)] = v1;
LABEL_9:LODWORD(v1) = 0;++HIDWORD(v1);}while ( HIDWORD(v1) < strlen(a1) );}return v1;
}
至此我们可以解出真正的flag