南郵CTF逆向 480小時精通C++

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

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章