下载题目文件,拖到IDA中打开,找到main函数。
F5查看伪代码。
用户先输入flag且长度必须是33,否则报错。
将flag中第二个字符开始,与前一个字符异或,得到__b,如果__b与global的前33位完全相等,则输出Success。
以上就是程序运行过程。
由此可以得知,只要知道global的值,就可以逆推出flag。
双击glabal查看,值如下:
得到global,就可以开始编写Python脚本解flag:
s = ['f',0xA,'k',0xC,'w','&','O','.','@',0x11,'x',0xD,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0xE,'g',6,'h',0xF,'G','2','O']
#注意'O'不是'0'
flag = 'f'
a = 0
b = 0
for i in range(len(s)-1):
if isinstance(s[i],str): a = ord(s[i]) #判断s[i]是否为字符型,如果是,则转化为Unicode数值
else: a = s[i]
if isinstance(s[i+1],str): b = ord(s[i+1]) #判断s[i+1]是否为字符型,如果是,则转化为Unicode数值
else: b = s[i+1]
flag += chr(a ^ b) #将a和b异或的结果转化为字符型并附加到flag
print(flag)
运行脚本,得到flag{QianQiuWanDai_YiTongJiangHu} ,也就是本题的flag。