题目
下载附件,用IDA-64打开
然后使用按键F5,查看一下主函数
然后我们来分析一下这个这串代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
char *v3; // rsi
int result; // eax
signed int i; // [rsp+2Ch] [rbp-124h]
char v6[264]; // [rsp+40h] [rbp-110h]
__int64 v7; // [rsp+148h] [rbp-8h]
memset(v6, 0, 0x100uLL);
v3 = (char *)256;
printf("Input your flag:\n", 0LL);
get_line(v6, 256LL);
if ( strlen(v6) != 33 )
goto LABEL_12;
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1];
v3 = global;
if ( !strncmp(v6, global, 0x21uLL) )
printf("Success", v3);
else
LABEL_12:
printf("Failed", v3);
result = __stack_chk_guard;
if ( __stack_chk_guard == v7 )
result = 0;
return result;
}
由下面的代码我们可知,字符串的长度为33位
if ( strlen(v6) != 33 )
由下面的代码我们可知,将输入的字符串从第二位开始,后一位与前一位异或
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1];
由下面的代码我们可知,在global存放的字符串是执行过上述算法后得到的字符串
if ( !strncmp(v6, global, 0x21uLL) )
我们双击下图的字符
跳到如下界面后,我们再次双击,下面的字符
我们就找到了,我们需要去疑惑的字符串了
然后我们用python写个脚本,来a^b=c 等于 a^c=b函数还还原出,flag
str1 = ['f',0x0A,'k',0x0C,'w','&','O','.','@',0x11,'x',0x0D,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0x0E,'g',6,'h',0x0F,'G','2','O']
f = 'f'
for i in range (1,len(str1)):
if (isinstance(str1[i],str)):
if (isinstance(str1[i-1],str)):
f +=chr(ord(str1[i]) ^ ord(str1[i-1]))
else:
f +=chr(ord(str1[i]) ^ str1[i-1])
else:
f +=chr(str1[i] ^ ord(str1[i-1]))
print(f)