findit 1
查壳
进64IDA,找主函数 --> 会发现没有主函数,字符串查找也看不懂
看着有点意思,跟进去看:
全是一些定义啥的,但是在注释那里我们能看到一种标志 --> JAVA语言的String(不确定是不是由他而来的,再看看),空格切换“视图”
好家伙,this (JAVA妥了)--> 进jadx(需要点java的基础哦):有两个定义好的数组(字符串)
x = “ThisIsTheFlagHome”,y = “pvkq{m164675262033l4m49lnp7p9mnk28k75}”(很像flag了,但是一看就知道是加密过后的,需要解密,不信的话可以交这个上去看看能不能过)
有个进example看程序:
这里我们只看这段方法:
我们能看到,y是凯撒密码(就是通过偏移而得来,这个密码的特点就是除了26个字母(大小写都包括)需要改变,其他保持不变即可)来的,那么我们需要逆推回去就是正确的flag了,x的方法可以不用看了,因为不涉及它。
逆推“m164675262033l4m49lnp7p9mnk28k75”,得到结果即可。写脚本吧大伙:
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
string Des = "m164675262033l4m49lnp7p9mnk28k75";
string flag = "";
for (int i = 0; i < Des.size(); i++) {
if((Des[i] >= 'a' && Des[i] <= 'z') ||(Des[i] >= 'A' && Des[i] <= 'Z')){
//写凯撒的加密方法
for (int j = 'a'; j <= 'z'; j++) {
if(j == Des[i]){
if((j + 16) > 'Z' && (j + 16) < 'a' || (j + 16) > 'z'){
flag += char(j - 10);
}else{
flag += char(j + 16);
}
break;
}
}
for (int j = 'A'; j <= 'Z'; j++) {
if(j == Des[i]){
flag += char(j + 16);
break;
}
}
}else{
flag += Des[i];
}
}
cout << "flag{" << flag << "}" << endl;
return 0;
}