程式扎記: [ OllyDbg 教學 ] 第一卷 入門 : 第二篇 - 字串參考

標籤

2011年6月12日 星期日

[ OllyDbg 教學 ] 第一卷 入門 : 第二篇 - 字串參考

參考自 看雪學院 - OllyDB入門教學 
前言 : 
上一篇是使用入門,現在我們開始正式進入如何使用 Ollydbg. 首先我們透過一個簡單的程式, 來示範如何透過 Ollydbg 來破解該程式的密碼輸入. 使用技巧為透過特定字串搜尋快速找到關鍵組碼的位置. 假設我們有程式碼如下 : 

- main.cpp : 透過輸入密碼判斷是否通過. (hard code 密碼為 1234)
  1. #include   
  2. #include   
  3. #include   
  4. using namespace std;  
  5.   
  6. void main()  
  7. {  
  8. }  

編譯完為 VTT.exe 執行檔, 透過 PEiD (Unpack 工具) 可以知道該程式是由哪種編譯器編譯 : 
 
由於這是我們自己寫的範例程式, 並未被 pack 過所以可以直接進行反編譯 (由上可以該程式由 Microsoft Visual C++ 8.0 編譯). 

觀察程式行為 : 
在開始反編譯之前, 建議可以先觀察一下程式的行為以有助於我們找到一些關鍵點快速進行分析與設定斷點. 故執行程式如下 : 
 
而上可觀察程式的行為 : 
1. 輸入用戶名.
2. 輸入密碼, 如果為 'exit' 則離開.
2.1 如果密碼錯誤則提示 'Wrong password. try again...'
2.1 如果密碼正確則...

好了,今天我們就從這個錯誤訊息中顯示的「Wrong password. try again...」來入手. 啟動 OllyDBG,選取選單 檔案->開啟 載入 VTT.exe 檔案,我們會停在這裡 : 
 

進行反編譯分析 : 
首先我們知道程式會需要使用者輸入用戶名, 而在這之前的代碼我們並沒有興趣 (我們有興趣的是密碼!!!!), 因此按下 F9, 則程式會停在等待用戶輸入名字的點 : 
 
接著我們輸入用戶名後再按 Enter, 然後再輸入密碼 123 在按下 Enter, 此時會出現錯誤訊息 'Wrong password. try again...' 並要求再次輸入密碼... 
接著我們從錯誤訊息著手, 我們在反編譯視窗中右擊,出來一個選單,然後在 尋找->所有參考文字字串(Search for -> All referenced text strings) 上左鍵點擊 : 
 

會出現下面視窗, 此時我們可以發現裡面有我們要找尋的錯誤提示訊息, 在上面 double click 可以帶我們回到對應組碼的位置 : 
 

回到組碼後, 觀察發現在 0042E816 . E8 42DFFFFF CALL VTT.0042C75D 可能是進行密碼判斷的地方, 因此我們在前一行設斷點. (按 F2) 
 

輸入完斷點後, 我們再次輸入密碼 : 
 

接著會發現 Ollydbg 停在剛剛我們設定的斷點, 接著便是按 F8 一步步執行到 0042E816 CALL VTT.0042C75D 按下 F7 進入呼叫的組語區段 : 
 

進入該區段後, 可以發現在 RETN 之前便是我們找尋驗證密碼的組語內容 : 
 

接著我們來看看這段的組語 : 
0042EF9E . 75 3C JNZ SHORT VTT.0042EFDC
0042EFA0 > 8B02 MOV EAX,DWORD PTR DS:[EDX] // 將 EDX 的記憶體位置指派給 EAX 暫存器, 而 EDX 存放剛剛我們輸入的密碼 "123"
0042EFA2 . 3A01 CMP AL,BYTE PTR DS:[ECX] // ECX 位置存放通關密碼 "1234", 這裡比較ECX 與 EAX 位置的第一個 BYTE.
0042EFA4 . 75 2E JNZ SHORT VTT.0042EFD4 // 如果不相等則跳到記億體位置 0042EFD4
0042EFA6 . 0AC0 OR AL,AL
0042EFA8 . 74 26 JE SHORT VTT.0042EFD0
0042EFAA . 3A61 01 CMP AH,BYTE PTR DS:[ECX+1] // 繼續比較 EAX 與 ECX 的第二個 BYTE...
0042EFAD . 75 25 JNZ SHORT VTT.0042EFD4 // 如果上一步不相等, 則跳到記億體位置 0042EFD4
0042EFAF . 0AE4 OR AH,AH
0042EFB1 . 74 1D JE SHORT VTT.0042EFD0
0042EFB3 . C1E8 10 SHR EAX,10
0042EFB6 . 3A41 02 CMP AL,BYTE PTR DS:[ECX+2] // 繼續比較 EAX 與 ECX 的第三個 BYTE...
0042EFB9 . 75 19 JNZ SHORT VTT.0042EFD4 // 如果上一步不相等, 則跳到記億體位置 0042EFD4
0042EFBB . 0AC0 OR AL,AL
0042EFBD . 74 11 JE SHORT VTT.0042EFD0
0042EFBF . 3A61 03 CMP AH,BYTE PTR DS:[ECX+3] // 繼續比較 EAX 與 ECX 的第四個 BYTE...
0042EFC2 . 75 10 JNZ SHORT VTT.0042EFD4 // 如果上一步不相等, 則跳到記億體位置 0042EFD4
0042EFC4 . 83C1 04 ADD ECX,4
0042EFC7 . 83C2 04 ADD EDX,4
0042EFCA . 0AE4 OR AH,AH
0042EFCC .^ 75 D2 JNZ SHORT VTT.0042EFA0
0042EFCE . 8BFF MOV EDI,EDI
0042EFD0 > 33C0 XOR EAX,EAX // 清除 EAX 暫存器的內容 (令 EAX=0).
0042EFD2 . C3 RETN // 從堆疊取出返回的記憶體位置
0042EFD3 90 NOP
0042EFD4 > 1BC0 SBB EAX,EAX

接著我們按 F8 一步步直到回去原來的呼叫記憶體區段, 並知道當 EAX 為 0 時會進入密碼正確的區段 : 
 

接著既然你知道密碼, 也知道判斷的邏輯, either 你輸入正確的密碼或是在進入 0042E820 JNZ SHORT VTT.0042E835 將 Zero flag 設為 1 都可以成功的破解程式, 到此你已經具備基本的 Ollydbg 使用技巧了. 在這裡你學會如何透過特定字串快速找到需要分析的組碼區段並設定斷點一步步分析觀鍵組碼以達到我們的目的.

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!