Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-11   OllyDBG   瀏覽次數:

OllyDBG - 第七章 | 反匯編練習 (一)

這邊開始就要針對網路上提供給新手的CrackMe程式進行練習,在後面幾篇應該都會是這些練習文章。在到達一定的反匯編的組合語言瓶頸的時候,將會開始針對組合語言進行學習了解。

註:這邊的教學和反匯編過程絕對不是絕對,一定有其他的方法和思路。

檔案下載

目的程式:
hello.7z

解壓縮密碼:

1
morosedog

使用PEid檢驗

檢驗顯示是使用Microsoft Visual C++ v6.0編寫。

開啟hello.exe使用並分析

  • 開啟 hello.exe
  • 彈出視窗標題為Hello內容為Welcome!

目標說明

標題內容的內容進行修改,並且另存檔案

思路 (本人弱弱的,勿噴)

  1. 首先為彈出視窗,所以應該可以利用OllyDBG - 第三章 | 函數參考的方式來找到斷點,接續進行分析找到記憶體位置進行修改內容。

  2. 硬幹法,一步一步看Code,看在什麼地方跳出視窗,針對該隊指令下斷點並進行分析,找到記憶體位置進行修改內容。

註:以上兩種方法,我都有實驗過,都可以達成目標

使用OllyDBG分析 (方法一)

  • 啟動OllyDBG
  • 按下快捷鍵F3
  • 選擇hello.exe
  • 在入口點地址後面加上註解 (良好的註解有助於分析)

  • 按下Ctrl + N
  • 瀏覽一下函數,在上方可以判定是一個訊息窗口,所以基本上找類似MessageBox的函數

  • 在該函數按下右鍵
  • 選擇在每個參考上設定斷點

  • 按下F9執行程式
  • 斷點在0040100E |. FF15 9C504000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

  • F7進入
  • F8一步一步到75F8FD28 FF75 10 push dword ptr ss:[ebp+10] ; hello.0040603C
  • 此時注意資訊視窗堆疊 ss:[0018FEF8]=0040603C (hello.0040603C), ASCII "Hello"
    • 說明了該Hello資料是從0040603C來的
  • 在資訊上窗上的這筆資料右鍵選擇在資料視窗中跟隨數值
  • 在最下面的資料視窗會看到Hello的數值

    註:這邊還不進行修改數值,繼續分析

  • 接續F8一步一步到75F8FD2B FF75 0C push dword ptr ss:[ebp+C] ; hello.00406030
  • 此時注意資訊視窗堆疊 ss:[0018FEF4]=00406030 (hello.00406030), ASCII "Welcome!"
    • 說明了該Welcome!資料是從00406030來的
  • 在資訊上窗上的這筆資料右鍵選擇在資料視窗中跟隨數值
  • 在最下面的資料視窗會看到Welcome!的數值

  • 在資料視窗中選反白Welcome!這段HEX 資料
  • 按下空白鍵

  • 在ASCII裡面輸入J.J's Blogs
  • 在HEX +0D 的最後面補上00,並按下確定

    註:00的用意可以參考,ASCII
    白話文就是字符串用00做為結尾

  • 按下F9
  • 看到訊息視窗跳出來
  • 此時可以看到內容已經變更為J.J's Blogs
    • 註:眼尖的你一定發現標題不見了,那是因為記憶體位置被蓋掉了(溢出),這邊不特別說明

  • 在資料視窗點擊右鍵選擇複製到可執行檔案

  • 在視窗按下右鍵選擇備份 -> 儲存資料到檔案
  • 另存在別的位置,黨名改為hello(Cracked).exe

  • 執行hello(Cracked).exe

    註:會發現內容怪怪的,標題又回來了⋯ (我不是很確定為什麼,所以不在這邊做解釋)

  • 目標達成


## 使用OllyDBG分析 (方法二)
  • 啟動OllyDBG
  • 按下快捷鍵F3
  • 選擇hello.exe
  • 在入口點地址後面加上註解 (良好的註解有助於分析)
  • 執行F8一步一步往下
  • 會發現執行到004010E9 |. E8 12FFFFFF call 00401000後會跳出訊息視窗
  • F2斷點在這
  • Ctrl + F2 重新開始
  • F9執行程式
  • 斷點到004010E9 |. E8 12FFFFFF call 00401000
  • 按下F7進入
  • 會進入到00401000 /$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL

針對代碼解釋

首先最前面知道是用C++撰寫的程式,然後使用的函數為MessageBox函數

下方可以看到傳入的參數類型為(HWND,LPCTSTR,LPCTSTR,UINT)

1
2
3
4
5
6
int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
  • 類型:HWND

    • 要建立的消息框的所有者窗口的句柄。如果此參數為NULL,則消息框沒有所有者窗口。
  • 類型:LPCTSTR

    • 要顯示的消息。如果字符串由多行組成,則可以使用每行之間的回車符和/或換行符分隔行。
  • 類型:LPCTSTR

    • 對話框標題。如果此參數為NULL,則默認標題為“ 錯誤”。
  • 輸入:UINT


回到反匯編代碼這邊看到OllyDBG很好心的根據dll自動註解了;
第一個動作 push 0 ;Style = MB_OK|MB_APPLMODAL
第二個動作 push 0040603C ;Title = "Hello"
第三個動作 push 00406030 ;Text = "Welcome!"
第四個動作 push 0 ;hOwner = NULL
第五個動作 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

夠過分析,可以發現匯編的動作和傳入的參數是相反的,所以參數堆疊的順序是從右往左的。

1
2
3
4
5
00401000  /$  6A 00         push 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 3C604000 push 0040603C ; |Title = "Hello"
00401007 |. 68 30604000 push 00406030 ; |Text = "Welcome!"
0040100C |. 6A 00 push 0 ; |hOwner = NULL
0040100E |. FF15 9C504000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

  • 分析完成後繼續F8
  • 停到00401002 |. 68 3C604000 push 0040603C ; |Title = "Hello"
  • 看到資訊窗口0040603C=0040603C (ASCII "Hello")表示該值的記憶體位址
  • 在下方的資料窗口,按下Ctrl + G
  • 輸入0040603C
  • 在資料視窗中選反白Hello這段HEX 資料
  • 按下空白鍵
  • 在ASCII裡面輸入J.J's
  • 在HEX +0D 的最後面補上00,並按下確定
  • 按下F9
  • 看到訊息視窗跳出來
  • 此時可以看到標題已經變更為J.J's
  • 後續步驟就不再示範⋯⋯請參考方法一後半部

總結

這次可以算是沒有先看教學就先做分析 (第一個方法),算是有成功踏出第一步,然後第二個方法,是教學文章提及的,主要值得學習的是在004010E9 |. E8 12FFFFFF call 00401000裡面那邊有特別做解釋,多增長一些知識。
慢慢地對於反匯編越來越有興趣了,共勉。


註:以上參考了
CSDN billvsme的专栏OllyDbg 使用笔记 (一)