1. 程式人生 > >jarvis oj reverse 病毒資料分析 writeup

jarvis oj reverse 病毒資料分析 writeup

這題之前做過,但是做到一半就放棄了,現在又回來做一下

首先這題其實還是有點難度的

我們先來分析下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()