首先先ida一下,发现程序逻辑比较简单,就是对flag进行了加密:
很明显:StringEncryptFunction函数是对flag进行加密的函数,main是主函数,点开看一下函数结构:
main函数:
(这里要考虑小端序,在对flag进行解密时要把字符串倒过来)
StringEncryptFunction函数结构截取:
点进去几个函数可以发现其实函数的结构是差不多的,只是有一个值发生了改变,
(此处为第一个函数和最后一个函数的截取片段)
由此可见,加密函数里面包括了480个函数,而他们的内部结构是差不多的,只不过是值从“001001001”变到了“480480480”,具体的函数结构如下图所示:
然后就可以上脚本了:
def encrypt_i(a1,a2,i):
key=str(i).zfill(3)*3
v9=key
v8=len(v9)
result=""
for i in range(a2):
v2=a1[i]
v3=v2
v4=v9[i%v8]
result+=chr(ord(v4)^ord(v3)^i)
return result
v6 = 'j4Nscadb';
v7 = '[n<g_q`o';
v8 = 'cWv3|waE';
v9 = 'Dt_{q1x[';
v10 = '})wu';
#62646163734e346a6f60715f673c6e5b4561777c337657635b7831717b5f74447577297d
encrypted_flag=v6[::-1]+v7[::-1]+v8[::-1]+v9[::-1]+v10[::-1]#注意加密的flag的输出顺序
for i in range(480,0,-1):
encrypted_flag=encrypt_i(encrypted_flag,len(encrypted_flag),i)
print encrypted_flag