天天看點

Crack密碼驗證小實驗

首先來看一段用于密碼驗證的C語言代碼:

#include<stdio.h>
#include<string.h>

#define PASSWORD "1234567"

int verify_password(char *password)
{
    int authenticated;
    authenticated = strcmp(password,PASSWORD);
    return authenticated;
}

int main()
{
    int valid_flag = ;
    char password[];
    while()
    {
        printf("please input password:       ");
        scanf("%s",password);
        valid_flag = verify_password(password);
        if(valid_flag)
        {
            printf("incorrect password!\n\n");
        }
        else
        {
            printf("Congratulation! You have passed the verification!\n");
            break;
        }
    }
    return ;
}
           

由代碼邏輯可知,必須輸入正确的密碼“1234567”才能得到密碼驗證的确認,跳出循環。不難發現,程式是提示密碼錯誤請求再次輸入,還是提示密碼正确跳出循環,完全取決于main函數中的if判斷。

Crack密碼驗證小實驗

如果我們能在.exe檔案中找到if判斷對應的二進制機器代碼,将其稍作修改,那麼即使輸入錯誤的密碼,也能通過驗證,下面,将一步步來實作該軟體的“爆破”。

實驗環境:

作業系統:WinXP Sp3

編譯器:Visual C++ 6.0

編譯選項:預設編譯選項

build版本:release版本

1.首先打開IDA,并把由VC 6.0得到的.exe檔案直接拖進IDA,稍等片刻,反彙編工作将完成。反彙編流程圖如下所示:

Crack密碼驗證小實驗

2.在IDA圖形顯示界面,用滑鼠選中程式分支點,即要尋找的對應C代碼分支點的if分支點,按空格鍵切換到彙編指令界面:

Crack密碼驗證小實驗

光标仍然顯示高亮的這條彙編指令就是剛才在流程圖中看到的分支指令。可以看到這條指令位于PE檔案的.text節,并且IDA已經自動将該指令的位址換算成了運作時的記憶體位址VA:004010D5。

3.現在關閉IDA,換成OllyDbg進行動态調試來看看程式到底怎樣分支的。用OllyDbg把PE檔案打開,如下:

Crack密碼驗證小實驗

OllyDbg在預設情況下将程式中斷在PE裝載處開始,而不是main函數的開始。一般情況下,main函數位于GetCommonLineA函數調用後不遠處,并且有明顯的特征:在調用之前有3次明顯的壓棧操作,因為系統要給main傳入預設的argc、argv等參數。找到main函數後,按F7鍵單步跟入就可以看到真正的代碼了。

Crack密碼驗證小實驗

4.也可以按快捷鍵Ctrl+G直接跳到由IDA得到的VA:0x004010D5處檢視那條引起程式分支的關鍵指令:

Crack密碼驗證小實驗

5.選中這條指令,按F2鍵下斷點,成功後,指令的位址會被标記成不同顔色。

按F9鍵讓程式運作起來,這時候程式控制權會回到程式,OllyDbg暫時挂起。到程式提示輸入密碼的Console界面随便輸入一個錯誤的密碼,回車确認後,OllyDbg會重新中斷程式,收回控制權。

密碼驗證函數的傳回值将存在EAX寄存器中,if()語句通過下列兩條指令實作:

TEST EAX,EAX
JE XXXXX
           

也就是說,EAX中的值為0時,跳轉将被執行,程式進入密碼确認流程;否則跳轉不執行,程式進入密碼重輸的流程。如果我們把JE這條指令修改為JNE(非0則跳轉),那麼整個程式的邏輯就會反過來:輸入錯誤的密碼被确認,輸入正确的密碼反而要求重新輸入!

6.輕按兩下JE這條指令,将其修改成JNE,單擊“Assemble”按鈕将其寫入記憶體,如下所示:

Crack密碼驗證小實驗

OllyDbg将彙編指令翻譯成機器代碼寫入記憶體。原來記憶體中的機器代碼74(JE)現在變成了75(JNE)。

7.上面隻是在記憶體中修改程式,還需要在二進制檔案中也修改相應的位元組,需要用到記憶體位址VA與檔案位址之間的對應關系。利用PEiD或類似軟體打開.exe檔案,檢視PE檔案的節資訊:

Crack密碼驗證小實驗

我們已經知道跳轉指令在記憶體中的位址是VA = 0x004010D5,按照VA與檔案位址的換算公式:

檔案偏移位址 = 虛拟記憶體位址(VA) - 裝載基址(Image Base) - 節偏移 = 0x004010D5 - 0x00400000 - (0x00001000 - 0x00001000) = 0x10D5

也就是說,這條指令在PE檔案中距離檔案開始處10D5位元組的地方。用UltraEdit按照二進制方式打開.exe檔案,按Ctrl+G,輸入0x10D5直接跳到JE指令的機器代碼處,将這一位元組的74(JE)修改成75(JNE),儲存後重新運作可執行檔案。

Crack密碼驗證小實驗

運作結果如下所示,原本正确的密碼“1234567”現在反而提示錯誤了,而輸入其他密碼均能正确通過。

Crack密碼驗證小實驗

本實驗出自王清的《0day安全:軟體漏洞分析技術》第一章入門内容。

繼續閱讀