下载附件,看一下信息,无壳,32位
丢进IDA看main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // edx
char *v4; // esi
char v5; // al
unsigned int i; // edx
int v7; // eax
char Arglist[16]; // [esp+2h] [ebp-24h] BYREF
__int64 v10; // [esp+12h] [ebp-14h] BYREF
int v11; // [esp+1Ah] [ebp-Ch]
__int16 v12; // [esp+1Eh] [ebp-8h]
sub_401020(Format, Arglist[0]);
v11 = 0;
v12 = 0;
*(_OWORD *)Arglist = 0i64;
v10 = 0i64;
sub_401050("%s", (char)Arglist);
if ( strlen(Arglist) == 24 )
{
v3 = 0;
v4 = (char *)&v10 + 7;
do
{
v5 = *v4--;
byte_40336C[v3++] = v5;
}
while ( v3 < 24 );
for ( i = 0; i < 0x18; ++i )
byte_40336C[i] = (byte_40336C[i] + 1) ^ 6;
v7 = strcmp(byte_40336C, aXircjR2twsv3pt);
if ( v7 )
v7 = v7 < 0 ? -1 : 1;
if ( !v7 )
{
sub_401020("right\n", Arglist[0]);
system("pause");
}
}
return 0;
}
分析一下程序
(其实没有第一个,看似打乱,实则反编译错误)
就三步骤
1.把调整输入的字符串的顺序
2.把每一位做亦或计算
3.与给定数组aXircjR2twsv3pt比较
那我们接着看一下aXircjR2twsv3pt是啥
就是我们输入的字符串经过处理后要等于xIrCj~<r|2tWsv3PtI...(注意,有坑,不止那一行)
这些都导出就好
那写python脚本(小端存储,记得最后结果要反转)
cmp = [0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32,
0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A,
0x6E, 0x64, 0x6B, 0x61]
res = ''
for c in cmp:
res += chr((c ^ 6) - 1)
print(res[::-1])
"""output
flag{xNqU4otPq3ys9wkDsN}
"""