题目来源:天狩CTF竞赛平台 Lihua's for
题目提示说是for循环,不管了干吧
先看加没加壳,没有,直接无脑IDA+F5

代码功能概述
程序会要求用户输入一个 flag,然后将输入的每个字符与索引值进行异或运算,并将结果与预定义的数据(unk_403040
)进行比较。如果所有字符都匹配,则输出 "good~",否则输出 "error!"。
cpp
_main();
qmemcpy(a, &unk_403040, sizeof(a));
// 从地址0x403040复制 42 字节数据到数组a中,这是预定义的目标数据。
puts("input flag");
scanf("%s", flag);
// 提示用户输入 flag,并读取字符串到flag数组中。
puts(flag);
for ( i = 0; i <= 41; ++i )
b[i] = i ^ flag[i];
// 对输入的每个字符进行处理:将字符与它的索引位置进行异或运算,结果存入数组b。
for ( i_0 = 0; i_0 <= 41; ++i_0 )
{
if ( a[i_0] != b[i_0] )
{
good = 0;
break;
}
good = 1;
}
if ( good == 1 )
printf("good~");
else
printf("error!");
return 0;
}
/* 逐个比较异或结果b与预定义数据a:
如果有任何不匹配,将good设为 0 并跳出循环。
只有当所有字符都匹配时,good才会保持为 1 */
点进去&unk_403040这个值里面,发现有字符串

红框框就是我们要找的数据,下面还有,一共是42个,我们把它们的十六进制提取出来

把这些十六进制写成一个列表,对它们进行异或运算:
python
a = [0x66,0x6D,
0x63,0x64,0x7F,0x64,
0x32,0x36,0x6A,0x6C,
0x3E,0x3D,0x39,0x20,
0x6F,0x3A,0x20,0x77,
0x3F,0x27,0x25,0x27,
0x22,0x3A,0x7A,0x2E,
0x78,0x7A,0x31,0x2F,
0x29,0x29,0x16,0x40,
0x44,0x45,0x12,0x47,
0x47,0x41,0x1A,0x54]
c = ""
b = 0
for i in a:
c += chr(b ^ i)
b += 1
print(c)
运行就出来flag了
bash
flag{a41be465-a50f-4124-b7ba-2766aff6baf2}