單向散列算法--MD5算法逆向分析


單向散列算法之——MD5算法

MD5算法(Message-Digest Algorithm 5)屬於單向散列算法的一種。它的功能是將任意長度的消息在經過處理后輸出一個128位的信息,從而實現加密,此加密不可逆,即無法通過密文反推出輸入的信息。

1、算法原理

(1)數據填充

填充待加密的消息使其長度與448512同余(即消息長度=448mod512byte=56mod64)。因此,消息的長度被拓展至N*512+448(位),即N*64+56(字節)。換句話說,填充后的消息長度比512的倍數小64位的數。注意,即使消息長度本身已經滿足上述需求,仍然需要填充。

填充方法是在數的后面附一個1,然后用0來進行填充,直到滿足填充要求。至少填充1位,至多填充512位。

(2)添加長度

在第一步的結果后添加64位長度的數據填充之前的消息長度(消息長度指位的長度)。如果填充前的消息長度大於264則取其低64位。在添加完長度后,最終消息長度是512的整數倍((N+1*512位)。

(3)初始化變量

用四個變量(ABCD)計算信息摘要。ABCD分別為一個32位的寄存器,用十六進制數初始化為A=01234567hB=89abcdefhC=fedcba98hD=76543210h。由於Intel x86系列都使用小端序進行存儲,所以在程序初始化時要注意書寫順序。

(4)數據處理

512位分組位單位處理消息,首先定義4個輔助函數,每個都是以332位雙字作為輸入,輸出為一個32位雙字。

F(X,Y,Z)=(X&Y)|((~X)&Z)

G(X,Y,Z)=(X&Z)|(Y&(~Z))

H(X,Y,Z)=X^Y^Z

I(X,Y,Z)=Y^(X|(~Z))

其中&是與操作,|是或操作,~是非操作,^是異或操作。

4輪變換是對進入主循環的512位消息分組的1632位字(即每512位消息,再划分位1632位消息進行處理)分別進行如下操作:使用臨時變量a,b,c,d中的三個經F,G,H,I變換后的結果與第4個相加,再加上32位字和一個32位字的加法常數,並將所得值循環左移若干位,最后將所得結果加上a,b,c,d之一,並返回A,B,C,D,由此完成一次循環。

所用的加法常數T[i]定義,其中i164的值,T[i]等於4294967296232)乘以abs(sin(i))所得結果的整數部分,其中i用弧度來表示。用於通過正弦函數和冪函數來消除線性。

(5)輸出

當所有的512位分組都運算完畢后,ABCD的級聯(映射關系)將被輸出為MD5散列的結果。

2、MD5在加密解密中的應用

MD5的特點:將任意長度的字符變換成一個128位的大整數,並且不可逆。

MD5代碼的特點:在數據初始化時必然會用到4個常數(A,B,C,D)。對於變形的MD5算法,常見由三種情況:一是改變初始化所用到的4個常數;二是改變填充的方法;三是改變Hash變換的處理過程。

3、實例分析

本實例使用《加密解密》的MD5KeyGenMe為例進行講解。首先使用PEiD進行掃描,判斷編程語言,是否加殼等。並且使用插件分析得知該文件中含有MD5常數,猜測可能使用了MD5算法,如圖3.1所示。

 

3.1 PEiD的插件掃描目標程序的加密算法

OllDbg(使用的是吾愛的OD)打開實例MD5KeyGenMe.exe,在命令行中輸入bpx GetDlgTextA對所有此函數下斷,接着按F9運行,在彈出的界面中輸入Name:xingzherufeng Serial Number0123456789ABCDEF,單擊“Check”按鈕,程序中斷在第一個下斷處,如圖3.2所示。

 

3.2 程序中斷在第一個GetDlgTextA處(0040116F

F8單步調試(不步入),觀察寄存器窗口各個寄存器的變化可以讀出以上有效信息。注意,在00401190處的條件判斷,判斷輸入的密鑰是否長度為13,我們一開始輸入的密鑰長度不符,因此需要修改判斷,由於上一條語句cmp eax,0x13得知相等時標志位ZF=1ZF=0表示結果不為0ZF=1表示結果為0),而此時JNZ是當結果不為0時跳轉,也就是長度不想等時跳轉,因此我們需要修改符號為ZF=1。下面幾個跳轉類似。如圖3.3所示。

 

3.3 修改標志位避免跳轉

接着F8單步到004011E0發現有一個Call跳轉,F7進入看一看,發現4個常數,很明顯這是在進行MD5初始化。但是根據這一點並不能完全確定這就是MD5,需要進一步判定。如圖3.4所示。

 

3.4 MD54個常量

繼續單步,遇到Call進入觀察,會發現在00401400這個段中(跳轉來自00401338)疑似存在MD5轉換代碼,進入后會發現如圖3.5所示代碼。

 

3.5 MD5轉化代碼

0040142B開始發現由與、或、非、左移以及常量T[i]00401441處出現的常量0x28955B88猜測為正弦函數表達式中的一個元素)等相關信息,並且下面具有循環代碼,由此推斷這里就是MD5轉化的代碼所在地,也因此確定本應用使用了MD5加密。

最后,繼續單步發現一個循環,循環下面出現IscmpA函數,猜測進行密鑰比較,如圖3.6所示。

 

3.6

發現字符串PCJGUM9BBVPUKDMV”以及我們輸入的序列號的比較,同時出現讓我們猜測是否這就是正確的序列號,復制下來,驗證一下(要注意的是,由於前面進行了第51015位置的“-”符號判斷,猜測每4個字符用“-”隔開)。如圖3.7所示。

 

3.7 序列號驗證

到此,此程序的分析暫告一段落。

有一個遺憾就是並未找出加密后的MD5碼所保存的位置,可能由於分析不夠細心,有的關鍵寄存器的值可能漏看,如有想法可以給我留言,我會修改。初玩逆向,分析很片面,作為一個記錄,用於以后查閱,歡迎指正錯誤,共同進步。

參考資料:《加密與解密》第三版

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM