1.查壳
不是exe文件,是Mac OS64位文件,没有壳。
2.用64位IDA打开
找到main函数,F5查看反汇编
这里global
是已有字符串,_b
是我们输入的字符串,_b
在经过异或运算之后,如果与global
相同,则输出"Success"
。
所以我们要拿到的flag是输入的_b
双击global查看
接下来开始写脚本
key = [ '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' ]
flag='f'
for i in range(0,len(key)-1):
if isinstance(key[i],str):
if isinstance(key[i+1],str):
x=ord(key[i]) ^ ord(key[i+1])
else:
x=ord(key[i]) ^ key[i+1]
else:
if isinstance(key[i+1],str):
x=key[i] ^ ord(key[i+1])
else:
x=key[i] ^ key[i+1]
flag=flag+chr(x)
print(flag)
flag{QianQiuWanDai_YiTongJiangHu}
补充
异或
运算规则
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A。
python中的 isinstance
函数
isinstance()用来判断一个对象是否是一个已知的类型,isinstance()函数的语法如下:
isinstance(object,classtype)
isinstance()函数的返回值是布尔型,若object的类型是classtype,那么就返回True,否则返回False。