Author:降草@i春秋
近期,大量國內用戶遭受到cerber勒索軟件的侵害,cerber作為新起的勒索軟件家族,大有后來居上的姿態,網上也有數篇對于cerber勒索軟件的行為的分析。這款勒索軟件,使用rsa非對稱加密加密用戶的文件,在沒有私鑰的情況下,基本上沒有可能解密出被勒索的文檔。這個勒索軟件比較新穎的使用了murmur hash算法,本文本著學習的精神,對murmurhash算法的原理及在此款勒索軟件中的使用作了簡單的分析。
Murmur hash算法介紹
MurmurHash是一種非加密型哈希函數,適用于一般的哈希檢索操作。 由Austin Appleby在2008年發明,并出現了多個變種,都已經發布到了公有領域。與其它流行的哈希函數相比,對于規律性較強的key,MurmurHash的隨機分布特征表現更良好。當前的版本是MurmurHash3,能夠產生出32-bit或128-bit哈希值。 MurmurHash算法具有高運算性能,低碰撞率等特點,這也人使的近些年對MurmurHash的使用風生水起,目前應用MurmurHash 的開源系統包括Hadoop、libstdc++、nginx、libmemcached。
Murmur hash 算法實現
根據維基百科上給出的偽代碼,我們使用python實現 murmur hash算法,如下:
def murmur3_x86_32(data, seed=0):[/size][/align][size=4]??? c1 = 0xcc9e2d51
????c2 = 0x1b873593
????r1 = 15
????r2 = 13
????m = 5
????n = 0xe6546b64
?
????length = len(data)
????h1 = seed
????rounded_end = (length & 0xfffffffc)? # every block contain 4 bytes
????for i in range(0, rounded_end, 4):
????????# translate to little endian load order
????????k1 = (ord(data[i]) & 0xff) | ((ord(data[i + 1]) & 0xff) << 8) | \
?????????????((ord(data[i + 2]) & 0xff) << 16) | (ord(data[i + 3]) << 24)
????????k1 *= c1
????????k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))? # ROTL32(k1,15)
????????k1 *= c2
?
????????h1 ^= k1
????????h1 = (h1 << r2) | ((h1 & 0xffffffff) >> (32-r2))? # ROTL32(h1,13)
????????h1 = h1 * m + n
?
????# the last block which is < 4 bytes
????k1 = 0
?
????val = length & 0x03
????# the last block is? 3 bytes
????if val == 3:
????????k1 = (ord(data[rounded_end + 2]) & 0xff) << 16
????# the last block is? 2 bytes
????if val in [2, 3]:
????????k1 |= (ord(data[rounded_end + 1]) & 0xff) << 8
????# the last block is? 1 bytes
????if val in [1, 2, 3]:
????????k1 |= ord(data[rounded_end]) & 0xff? # translate to little endian load order
????????k1 *= c1
????????k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))
????????k1 *= c2
????????h1 ^= k1
?
????# finalization
????h1 ^= length
????h1 ^= ((h1 & 0xffffffff) >> 16)
????h1 *= 0x85ebca6b
????h1 ^= ((h1 & 0xffffffff) >> 13)
????h1 *= 0xc2b2ae35
????h1 ^= ((h1 & 0xffffffff) >> 16)
????# for 32 bit, get the last 32 bits
????return h1 & 0xffffffff
對樣本中的調用murmurhash的地方下斷,可以看到對數據“65 2F3B 3C D1 40 02 4C BA 68 C0 D0”進行hash的結果為“BF35B592”

通過我們的腳本驗證,對比結果,可以看到我們腳本的運行結果也為“BF35B592”

cerber勒索軟件中對murmurhash算法的使用
cerber勒索軟件對murmurhash函數的使用有兩點我們要搞清楚。
- Murmurhash函數的seed值為什么?
- 勒索軟件調用murmurhash的作用是什么?
對于第一個問題: 通過對cerber軟件中murmurhash算法的逆向,可以看到seed的值為0,在下面的代碼中的edx的值就為murmurhash算法的初始化的seed值

對于第二個問題

通過上圖可以看出,cerber勒索軟件中共有5處使用了murmurhash函數,實際上只在三個函數中調用了murmurhash函數,調用murmurhash函數的函數為: 40B074解密出勒索使用的config內容后,解析config內容 409ADE解密字符串函數中使用 401DB9加密文件時,生成murmurhash保存在加密后的文件中
1.對于40B074處的算法使用:
通過自定義的數據結構填充加密信息,在這個加密信息的結構體中的一項指定的數據就是murmurhash計算的結果值,隨后對使用全局的公鑰加密這個數據結構,并將對其base64后的結果寫入到注冊表中。

2.對于409ADE解密字符串的使用
在解密字符串中,使用murmur hash獲得加密字符串的hash:

3.對于加密文件函數401DB9中的使用 組成下面的數據結構

對這個數據結構所的塊進行加密后,寫入加密后的文件

總結
本文只是對cerber勒索軟件中的murmurhash算法進行了分析,對這款勒索軟件家族的描述可以參考網絡上的其他文章。由于本人也是第一次聽說murmur算法,文章為自己分析cerber勒索遇到新的加密算法時的一點學習總結,有分析不恰當的地方,還望海涵。
原文地址:http://bbs.ichunqiu.com/thread-14070-1-1.html?from=seebug
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/84/
暫無評論