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 = 0;
    char password[1024];
    while(1)
    {
        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 0;
}

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

1

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

實驗環境:
操作系統:WinXP Sp3
編譯器:Visual C++ 6.0
編譯選項:默認編譯選項
build版本:release版本

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

2

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

3

光標仍然顯示高亮的這條彙編指令就是剛纔在流程圖中看到的分支指令。可以看到這條指令位於PE文件的.text節,並且IDA已經自動將該指令的地址換算成了運行時的內存地址VA:004010D5。

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

4

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

5

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

6

5.選中這條指令,按F2鍵下斷點,成功後,指令的地址會被標記成不同顏色。
按F9鍵讓程序運行起來,這時候程序控制權會回到程序,OllyDbg暫時掛起。到程序提示輸入密碼的Console界面隨便輸入一個錯誤的密碼,回車確認後,OllyDbg會重新中斷程序,收回控制權。

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

TEST EAX,EAX
JE XXXXX

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

6.雙擊JE這條指令,將其修改成JNE,單擊“Assemble”按鈕將其寫入內存,如下所示:

7

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

7.上面只是在內存中修改程序,還需要在二進制文件中也修改相應的字節,需要用到內存地址VA與文件地址之間的對應關係。利用PEiD或類似軟件打開.exe文件,查看PE文件的節信息:

8
我們已經知道跳轉指令在內存中的地址是VA = 0x004010D5,按照VA與文件地址的換算公式:
文件偏移地址 = 虛擬內存地址(VA) - 裝載基址(Image Base) - 節偏移 = 0x004010D5 - 0x00400000 - (0x00001000 - 0x00001000) = 0x10D5
也就是說,這條指令在PE文件中距離文件開始處10D5字節的地方。用UltraEdit按照二進制方式打開.exe文件,按Ctrl+G,輸入0x10D5直接跳到JE指令的機器代碼處,將這一字節的74(JE)修改成75(JNE),保存後重新運行可執行文件。

9

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

這裏寫圖片描述

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

發佈了43 篇原創文章 · 獲贊 100 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章