最近因為工作需要在看0day的軟件漏洞分析,發現這本《0day安全軟件漏洞分析技術(第2版)》真是本好書,唯一缺點就是書上的環境是Windows XP 32Bit的,基於現狀難以進行實踐,於是筆者打算使用緊跟潮流但又盡量滿足書上的環境——Windows 10 Profession 32Bit,希望對大家學習有所幫助。
一、環境以及要用的軟件
系統:Windows 10 Profession
軟件:UltraEdit、LordPE、OllyDBG、VC++ 6.0、IDA Pro
下圖作者的系統信息,就是一個虛擬機而已:

二、實驗目的
本次實驗的目的是通過更改軟件的十六進制值達到輸入任何密碼都能突破驗證。
三、實現過程
首先我們用VC++ 6.0編寫一個可供此次實驗的C語言程序,代碼如下:
#include<stdio.h>
#include<string.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
authenticated = strcmp(password, PASSWORD);
return authenticated;
}
void 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("No, your password is False!\n\n");
}
else
{
printf("Yes, your password is True!\n");
break;
}
}
}
上述代碼的具體意思不作解釋,若想看懂請自行翻閱C語言的相關書籍,比如C語言編程兵書等等。
上述代碼經過編譯運行會形成如下的運行結果:

從運行結果與我們程序的代碼不難發現,這個軟件的密碼只會是1234567,那么現在關閉它,開始我們的破解之路吧。先用IDA Pro打開這個名為Crack的exe文件,作者的exe文件在C:\MyProjects\Debug\Crack.exe此目錄下,大家請找到自己的文件所在位置,打開之后會出現如下圖的樣子:

某些時候打開會是一個一個的圖片,請仔細看上圖中的紅框對應你軟件的位置,那里有個黃色的小箭頭,鼠標點住它往左拖就可以看到上面這種樣式。
在上圖黑框中有我們程序中出現的一句話,這里是輸入錯誤密碼時才會出現的,那么前面的“JE short_loc xxxxxx”這句話其實就代表了程序中的if語句,請將這句話前面的號碼記住復制下來,我這里是004010D5,如下圖:

為啥要記住這個呢?因為我們就要從if語句下手,分析程序可以知道if...else...語句其實就是用來判斷我們輸入密碼正確錯誤的關鍵,所以要對症下葯。
當我們找到004010D5時就可以關閉上一步的軟件了,接下來打開OllyDBG,動態調試這個程序可以更好的為下面的步驟做准備,打開之后應該會出現下圖所示:

按Ctrl+G,在彈出的窗口中輸入剛剛復制的十六進制地址。如下圖:

點擊OK之后會跳轉到前面第二步中我們看到的代碼上。如上圖紅框,注意紅框中的數字“74”哦!點擊之后按F2,打個斷點,接下來按F8進行單步調試,在Crack程序的運行框中出現“please input password”字樣后輸入一個錯誤的密碼,再返回到上圖,點擊“JE short_loc xxxxxx”字樣的代碼句,下面一個小框中會出現“Jump is NOT taken”的字樣。如下圖:

這本身是一個錯誤的密碼,按照程序的邏輯,它會給我們打印“No, your password is False!”,但別忘記我們的初心是想讓它給我們打印“Yes, your password is True!”,這時候我們雙擊“JE short_loc xxxxxx”字樣的代碼句,在彈出的框中將“JE”改成“JNE”,后面保持原狀,之后點擊Assemble按鈕,注意看這句話它前面的數字變成了“75”哦,最后點擊Olly DBG軟件最上面的倒三角按鈕。如下圖:

這時候再轉回去看輸出的結果,會驚奇的發現,打印的是“Yes, your password is True!”這樣我們的目的就達到了,可這並不是我們的終極目標,我們是想要修改自己編的軟件,從根源上修改它!於是進入下一步。
在這一步中我們需要用到第四個軟件——LordPE,在打開之前請關閉OllyDBG軟件,LordPE打開之后界面如下圖所示:

點擊PE Editor按鈕打開Crack.exe之后會出現如下圖所示:

這里主要是記住ImageBase后面的十六進制數字,用前面得到的十六進制數字減這個十六進制數字得到004010D5 - 00400000 = 0x10D5。
得到0x10D5后就可以關閉這個軟件了,如果你用的是Windows10 64Bit的系統,就會發現你的ImageBase與我的完全不一樣,如下圖是64位Windows10的ImageBase:

這是最后一步,我們打開UltraEdit,將Crack.exe拖入UltraEdit中,會出現一大片數字和字母,打開之后按Ctrl + G,在彈出的框中輸入0x10D5之后回車,會跳轉到一個地方,如下圖:

在上圖中箭頭指向的地方有一個醒目的74,還記得前面第3步說過的數字“74”么?對,沒錯,這里的74就是第3步中的74!還記得我們將“JE”改成“JNE”之后數字變成了“75”么?最后一步就是將這個“74”改成“75”,然后Ctrl + S保存即可哦,如下圖:

這時候我們再用OllyDBG打開Crack.exe測試發現,如果輸入的密碼為1234567,反而是錯的了,其余的則是正確。測試如下圖:

以上是今天要學習的內容,后面作者會持續更新這一系列的內容,希望大家多多關注哦!
參考書籍
《0day安全軟件漏洞分析技術(第2版)》 王清 主編