1. 程式人生 > >南郵ctf攻防平臺RE第四題WxyVM1

南郵ctf攻防平臺RE第四題WxyVM1

用Winhex開啟以後可以看出來是ELF檔案,所以用IDA開啟,找到main函式,F5。
這裡寫圖片描述
可以看出來,程式的意思就是:輸入flag,經過sub_4005B6那個函式進行運算,然後長度必須為24,再與最終答案進行比較,檢測是否正確。
接下來看那個執行的函式:
這裡寫圖片描述
6010C0是一個長度為15000的陣列,每3個分為一組,分別為v0,v1,v2。一共5000組。v0是檢測進行哪種運算,一共有5種運算,加減乘異或。v1是選擇輸入的哪一位進行運算,v2是運算數。最後與601060中的資料進行比較。所以解題思路就是用601060中的資料將上面的運算進行逆運算,這樣就可以得到正確輸入。
下面是python程式碼:

c = ''' C4 34 22 b1 d3 11 97 07  db 37 c4 06 1d fc 5b ed 98 df 94 d8 b3 84 cc 08 '''
d=[] for i in c.split(): d.append(int(i,base=16)) for i in range(5000): v0 = b[3*(4999-i)] v1 = int(b[3*(4999-i)+1],base=16) # print(v1) v3 = int(b[3 * (4999 - i) + 2], base=16) print(v3) if v0 =="01": d[v1] -= v3 elif v0 == '02': d[v1] += v3 elif v0 =='03'
: d[v1] ^= v3 elif v0 == '04': d[v1] = d[v1]/v3 elif v0 == '05': d[v1] ^= d[v3] else: continue print(''.join([str(chr(int(i)%128))for i in d]))

結果是:nctf{Embr4ce_Vm_j0in_R3}

有一個重要的點是最後對比的陣列,是一個char型別的,所以我們取資料的時候每4位取最低位,而不是直接取。這個問題糾結了我好久,最後還是有個學弟告訴我的。。。