首先先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