jarvis oj reverse 病毒資料分析 writeup
阿新 • • 發佈:2019-02-04
這題之前做過,但是做到一半就放棄了,現在又回來做一下
首先這題其實還是有點難度的
我們先來分析下main函式部分,首先它做了反debug判斷,獲取父程序資訊
其次它還判斷了程式所在位置,過了這幾個判斷之後,獲取當前時間作為seed給srand
然後在登錄檔裡面拿到文件所在的目錄
接著在目錄裡面搜尋docx字尾的檔案,將其加密之後傳送出去
在加密那裡,它做了幾件事
1. 生成8位元組隨機數
2. new了一個緩衝區,首先往裡面放了檔案的大小,然後在裡面填了bufFileContent這個字串,之後往裡面塞檔案內容,然後在最後加上bufFileName,然後在加上檔名
3. 之後在加密函式裡面,先拿緩衝區前8個位元組,用tea加密,加密的key可以從資料包中拿到,加密完之後,xor一下生成的8位元組隨機數
4. 之後再拿緩衝區8個位元組,異或前一個8位元組tea加密之後的資料,然後用tea加密這個資料,然後再異或前8個沒加密位元組,之後一直迴圈這樣 (感覺我也說不清楚….還是自己除錯或者看下我下面放出來的程式碼吧
有了加密的過程,逆推就得到未加密的資料
這裡一個關鍵是,如何得到srand的seed?
因為這個時間可以在資料包中獲取,但是這個是不準的,我試了一下,發現準確的seed是 1465461209
下面就是解密的程式碼
import struct
import binascii
def rev(x):
return struct.unpack('>L',struct.pack('<L',x))[0]
def u32(x):
return struct.unpack('<L',x)[0]
def p32(x):
return struct.pack('<L' ,x)
def d32(x):
x=x.strip()
x=x.replace(" ",'')
return binascii.a2b_hex(x)
def enc(y,z,key,round=16):
sum=0
delta=0x9e3779b9
for i in range(round):
sum+=delta
sum&=0xffffffff
y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1])
y&=0xffffffff
z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3])
z&=0xffffffff
print(hex(y),hex(z))
return y,z
def dec(y,z,key,round=16):
delta=0x9e3779b9
sum=delta<<4
for i in range(round):
z -= ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3])
z+=0xffffffff+1
z&=0xffffffff
y -= ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1])
sum -= delta
sum+=0xffffffff+1
y+=0xffffffff+1
y&=0xffffffff
sum&=0xffffffff
return y,z
#key=[0x84be2329 ,0xaed66ce1 ,0x7c80ef87 ,0xd212ffb0]
#time=1465461209
key=[0x2923be84 ,0xe16cd6ae ,0x87ef807c ,0xb0ff12d2]
rand1=u32(b'\xc3\xe6H\xf6')
rand2=u32(b'\xe0\xf7"~')
f2=open('./t1','rb')
enc=f2.read()
f2.close()
t1=u32(enc[:4])
t2=u32(enc[4:8])
t1_d=t1^rand1
t2_d=t2^rand2
t1_dec,t2_dec=dec(rev(t1_d),rev(t2_d),key)
ans=[]
ans.append(t1_dec)
ans.append(t2_dec)
for i in range(8,len(enc),8):
tt1=rev(u32(enc[i:i+4]))
tt2=rev(u32(enc[i+4:i+8]))
tt1_d=tt1^t1_dec
tt2_d=tt2^t2_dec
tt1_dd,tt2_dd=dec(tt1_d,tt2_d,key)
tt1_dec=tt1_dd^rev(t1_d)
tt2_dec=tt2_dd^rev(t2_d)
t1_dec=tt1_dec
t2_dec=tt2_dec
t1_d=rev(tt1_d)
t2_d=rev(tt2_d)
ans.append(t1_dec)
ans.append(t2_dec)
f1=open('./ans','wb')
for i in ans:
f1.write(p32(rev(i)))
f1.close()