无壳直接扔到ida中静分析
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[240]; // [rsp+0h] [rbp-1E0h] BYREF
char v5[240]; // [rsp+F0h] [rbp-F0h] BYREF
memset(s, 0, 0x1EuLL);
printf("Please Input Key: ");
__isoc99_scanf("%s");
encode(v5, s);
if ( strlen(v5) == key )
{
if ( !strcmp(s, enflag) )#enflag db 'izwhroz""w"v.K".Ni'
puts("You are Right");
else
puts("flag{This_1s_f4cker_flag}");
}
return 0;
}
主函数将s与enflag函数比较,如果相同就正确,跟进enflag发现字符串,s是经过encode函数处理后的字符串,跟进encode函数观察代码
nt __fastcall encode(const char *a1, __int64 a2)
{
char v3[104]; // [rsp+10h] [rbp-70h]
int v4; // [rsp+78h] [rbp-8h]
int i; // [rsp+7Ch] [rbp-4h]
i = 0;
v4 = 0;
if ( strlen(a1) != key )
return puts("Your Length is Wrong");
for ( i = 0; i < key; i += 3 )
{
v3[i + 64] = key ^ (a1[i] + 6);
v3[i + 33] = (a1[i + 1] - 6) ^ key;
v3[i + 2] = a1[i + 2] ^ 6 ^ key;
*(a2 + i) = v3[i + 64];
*(a2 + i + 1LL) = v3[i + 33];
*(a2 + i + 2LL) = v3[i + 2];#a2是一个数组*a2指的是数组a2的第一个元素,所以这里的三个赋值就是将处理后的数字放到数组a2中
}
return a2;
}
#key dd 12h
函数返回的a2就是s,所以逆推出异或前的a1得到flag
flag=''
key=18
a1='izwhroz""w"v.K".Ni'
for i in range(0,18,3):
flag+=chr((ord(a1[i])^key)-6)
flag+=chr((ord(a1[i+1])^key)+6)
flag+=chr(ord(a1[i+2])^key^6)
print(flag)
#unctf{b66_6b6_66b}