下载附件,IDA打开,直奔main函数
如果输入的字符串不是'EIS{' 开头 '}'结尾,则退出
然后if ( sub_4011C0(Str) )则提示成功
进sub_4011C0()看一下
我们传入的字符串经过一系列处理之后要等于GONDPHyGjPEKruv{{pj]X@rF
如果字符区间为[97,122],则通过f(x)=x-32映射到值域[65,90]
如果字符区间为[65,90],则通过f(x)=x+32映射到值域[97,122]
那么我们就可以通过字符的ascii值确定还原函数了。
然后再做一个 Str2[i] = word_4420B0[i] ^ sub_4013C0(v8[i]); 变换
word_4420B0为一个数组,sub_4013C0为一个函数,v8[i]是我们刚刚有映射处理的结果
shift+e导出word_4420B0数组
sub_4013C0()函数
写python脚本复原
s = 'GONDPHyGjPEKruv{{pj]X@rF'
result = ''
word = ('\r',
'\x13',
'\x17',
'\x11',
'\x02',
'\x01',
' ',
'\x1D',
'\f',
'\x02',
'\x19',
'/',
'\x17',
'+',
'$',
'\x1F',
'\x1E',
'\x16',
'\t',
'\x0F',
'\x15',
'\'',
'\x13',
'&',
'\n',
'/',
'\x1E',
'\x1A',
'-',
'\f',
'\"',
'\x04')
def check(c, i):
if 97 <= c <= 122:
c -= 32
elif 65 <= c <= 90:
c += 32
return ord(word[i]) ^ ((c ^ 0x55) + 72)
for i, si in enumerate(s):
si = ord(si)
for ci in range(32, 123):
if check(ci, i) == si:
result += chr(ci)
break
print(result)
"""
wadx_tdgk_aihc_ihkn_pjlm
"""
flag为 EIS{wadx_tdgk_aihc_ihkn_pjlm}