南郵ctf攻防平臺RE第四題WxyVM1
阿新 • • 發佈:2019-02-14
用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位取最低位,而不是直接取。這個問題糾結了我好久,最後還是有個學弟告訴我的。。。