網路安全自學篇(六)| OllyDbg動態分析工具基礎用法及Crakeme逆向破解

  • 2020 年 3 月 12 日
  • 筆記

一.OllyDbg工具簡介

OllyDbg是一個新的動態追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3級調試器,非常容易上手,是當今最為流行的調試解密工具之一。它還支援插件擴展功能,是目前最強大的調試工具之一。

OllyDbg打開如下圖所示,包括反彙編窗口、暫存器窗口、資訊窗口、數據窗口、堆棧窗口。

  • 反彙編窗口:顯示被調試程式的反彙編程式碼,包括地址、HEX數據、反彙編、注釋
  • 暫存器窗口:顯示當前所選執行緒的CPU暫存器內容,點擊標籤可切換顯示暫存器的方式
  • 資訊窗口:顯示反彙編窗口中選中的第一個命令的參數及跳轉目標地址、字元等
  • 數據窗口:顯示記憶體或文件的內容,右鍵菜單可切換顯示方式
  • 堆棧窗口:顯示當前執行緒的堆棧

下圖是打開EXE後顯示的介面。

下面簡單講解常用的快捷鍵調試方式。

F2

設置斷點,如下圖所示的紅色位置,程式運行到此處會暫停,再按一次F2鍵會刪除斷點。

F9

按下這個鍵運行程式,如果沒有設置相應的點,被調試的程式直接開始運行。

F8

單步步過,每按一次這個按鍵,將執行反彙編窗口中的一條指令,遇到CALL等子程式不進入其程式碼。

F7

單步步入,功能通單步步過(F8)類似,區別是遇到CALL等子程式時會進入其中,進入後首先停留在子程式的第一條指令上。如下圖進入CALL子程式。

F4

運行到選定位置,即運行到游標所在位置處暫停。

CTRL+F9

執行到返回,按下此鍵會執行到一個返回指令時暫停,常用於從系統領空返回到我們調試的程式領空。

ALT+F9

執行到用戶程式碼,從系統領空快速返回我們調試的程式領空。

二.OllyDbg分析Crakeme示例1

第一個案例是 《加密與解密》書中Crakeme v3.0的文件,需要解密用戶名和序列號。

點擊「Register now」按鈕,會有輸入錯誤相關的提示,如下圖所示。

OllyDbg動態分析的基本流程如下:

  • 通常拿到一個軟體先試著運行軟體,如果有幫助文檔查閱幫助文檔,熟悉軟體的基本用法,接著嘗試輸入錯誤的註冊碼,觀察錯誤提示。
  • 如果沒有輸入註冊碼的地方,要考慮是否是讀取註冊表或Key文件(程式讀取一個文件中的內容判斷是否註冊),這些可以用其他工具來輔助分析。
  • 如果都不是,原程式只是一個功能不全的試用版,那要註冊為正式版需要手動寫程式碼完善。
  • 如果需要輸入註冊碼,如上圖所示,則調用查殼軟體檢查程式是否加殼(如PeiD、FI),有殼的需要脫殼之後再調用OllyDbg分析調試,無殼的直接調用工具調試。

下面開始正式的分析。

第一步:調用PEiD檢測程式是否加殼。

回饋結果為「Borland Delphi 4.0 – 5.0」,無殼Delphi編寫的文件。

第二步:運行CrakeMe V3.0文件,並點擊「Register now」,提示錯誤資訊。

對話框提示錯誤資訊「Wrong Serial, try again!」。

第三步:啟動OllyDbg軟體,選擇菜單「文件」,打開CrackMe3文件。

此時文件會停留在如下位置,雙擊注釋位置能添加自定義注釋。

第四步:在反彙編窗口右鍵滑鼠,選擇「查找」->「所有參考文本字串」。

彈出如下圖所示的對話框。

第五步:右鍵選擇「查找文本」,輸入「Wrong」定位「Wrong Serial, try again!」位置。

如下圖所示,定位到「Wrong Serial」位置。

第六步:接著右鍵滑鼠,點擊「反彙編窗口中跟隨」。

接著定位到如下圖所示位置。

第七步:選中該語句右鍵「查找參考」-:「選定地址」(快捷鍵Ctrl+R)。

彈出如下圖所示的「參考頁面」。

第八步:雙機上面的兩個地址(00440F79、00440F93),去到對應的位置。

在反彙編窗口中向上滾動窗口,可以看到核心程式碼:

第九步:通過查看跳轉到「Wrong serial, try again」字元串的指令,可以查詢相應的程式。

在「調試選項」->「CPU」->勾選「顯示跳轉路徑」及「如跳轉未實現則顯示灰色路徑」和「顯示跳轉到選定命令的路徑」。

如下圖所示:

第十步:詳細分析反彙編程式碼。

在下圖中,地址0040F2C處按下F2鍵設置斷點,接著按F9運行程式。

輸入「Test」和「754-GFX-IER-954」,點擊「Register now!」,顯示結果如下圖所示。

程式會在斷點處停止,同時提示剛才輸入的內容。

輸出內容如下所示,其中記憶體地址02091CE0中輸入了剛才的「Test」。

第十一步:左擊「ss:[0019F8FC]=02091CE0,(ASCII 「Test」)」,右鍵選擇「數據窗口中跟隨數值」,會在數據窗口中看到輸入的內容。EAX=00000004 表示輸入內容的長度為4個字元。

第十二步:調用F8按鍵和F7按鍵一步步分析程式碼。

回到下面00440F2C這部分程式碼,按下F8一步步運行,注意下面的核心程式碼。

第十三步:當F8運行到「00440F34 |. E8 F32BFCFF call crackme3.00403B2C」時,按下F7進入CALL子程式,此時游標停留在如下所示位置(00403B2C)。

這裡的PUSH ebx、PUSH esi等都是調用子程式保存堆棧時使用的命令,按F8一步步運行程式碼。其核心解釋如下,是基礎的彙編語言:(參考看雪CCDebuger大神的《OllyDBG入門教程》)

重點:程式運行到如下圖所示介面時,可以看到「Test」和「Registered User」的比較。通過上面圖片的分析,我們知道用戶名必須為「Registered User」。

第十四步:接著按F9鍵運行程式,出現錯誤對話框,點擊確定,重新在編輯框中輸入「Registered User」,再次點擊「Register now!」按鈕,分析調試程式。

注意,F12鍵為暫停。

核心程式碼如下,其中地址00440F34的CALL已經分析清楚,繼續F8執行下一步,知道第二個關鍵地方,即00440F51,按下F7進入子程式。注意:注釋內容的提示不一定存在,需要動態調試程式到暫存器查看對應的註冊碼,才是正確的做法。

上面兩句程式碼可以看到用戶名和註冊碼都是調用同一子程式,這個CALL分析方法和上面一樣。

第十五步:按F8調試該子程式,發現cmp比較兩個值是否相等,其中0044102C為註冊碼內容。

第十六步:按F12暫停,再按F9重新運行,輸入正確的用戶名和密碼,解密成功。

Registered User

GFX-754-IER-954

難點:調試程式時如何核心程式碼,比如這裡的CMP比較,同時彙編程式碼也比較晦澀。

三.OllyDbg分析Crakeme示例2

這個案例是破解Crakeme中的Afkayas.1.EXE,這是典型的字元串序列破解程式,根據name的值推出serial。

第一步:通過PEiD檢查它無殼,VB編寫的。

第二步:OllyDbg工具打開Afkayas.1.EXE文件如下圖所示。

第三步:反彙編區域右鍵滑鼠,選擇「查找」->「所有參考文本字串」。

第四步:在彈出的對話框中找到失敗的提示字元「You Get Wrong」,右鍵「反彙編窗口中跟隨」。

此時會回到程式碼區,可以看到失敗和成果的字元串。

第五步:通常成功和失敗的回饋字元串相隔不遠,需要在之前判斷,如果輸入的serial正確則成功,否則失敗;接著向上找到調用字元串比較函數的入口點。

注意,這一步比較關鍵,但個人覺得需要長時間的經驗和實踐,才能準確定位。

彙編調用函數之前會先把參數入棧,然後用CALL指令調用函數。在字元串比較函數之前有一句 PUSH EAX 指令,可以推測這裡的EAX就是字元串的首地址。

第六步:在比較函數00402533處按下F2鍵設置斷點,接著按F9鍵執行,此時會彈出運行介面,我們輸入「Eastmount」和「12345678」,然後點擊OK按鈕。

此時程式停留在斷點處,右下角堆棧區顯示了提示的正確Serial。

第七步:輸入正確的用戶名和Serial,成果註冊。

Eastmount

AKA-877848

下面結合鬼手大神和海天一色大神的博文,簡單分析加密的基本邏輯,同時強烈推薦大家閱讀他們的文章,參見前面的參考文獻。這些逆向的經驗真不是一朝一夕就能獲取的,深知自己要學習和經歷的東西太多,你我一起加油。

基本流程如下:

serial = 『AKA-』 + 逆序itoa(strlen(name) * 0x17CFB + name[0])

  • 求出了用戶名的長度
  • 將用戶名長度乘以0x17CFB得到結果 如果溢出則跳轉
  • 將結果再加上用戶名的第一個字元的ASCII
  • 將結果轉為十進位
  • 將結果和AKA進行拼接,得到最後的序列號

下面分享一段Python的解密程式碼。

定義不同的用戶名可以得到對應的Serial。

四.總結

寫到這裡,這篇基礎性文章就敘述完畢,網路安全要學習的知識真的很多,涉及面很廣,包括彙編、網路、作業系統、加密解密、C/C++、Python等。希望自己能慢慢進步,科研與實踐並重,也希望讀者喜歡這系列總結筆記。不喜勿噴,與你同行~

原文鏈接:

https://blog.csdn.net/Eastmount/article/details/99088681