Crack小實驗
#include<stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
authenticated = strcmp(password,PASSWORD); //strcmp比較兩個字符,若相等回傳0
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\n");
break;
}
}
return 0;
}

IDA靜態反匯編
- 將編譯的.exe用IDA打開,IDA就會把二進制檔案翻譯成質量上乘的反匯編代碼

- 按下空格鍵會顯示類似函式的流程圖

- 選中程式的分支點,也就是C代碼的if陳述句,按空格鍵切換到匯編指令界面
- VA(虛擬記憶體地址)=RVA(相對虛擬地址) — Image Base(映射基址)
- 可以看到這條指令位于PE檔案的.text節,VA:00401578

OllyDbg動態調式
- 注意32位或者64位的程式,要對應版本進行調式
- 將.exe檔案用ollydbg打開,使用快捷鍵ctrl+g搜索由IDA分析出來的VA(虛擬記憶體地址)

-
選中這條指令按F2設定斷點,成功后指令會被標記成不同顏色,按下F9讓程式運行,進入程式輸入錯誤密碼,回車確認后,ollydbg會重新中斷程式,識訓控制權

-
密碼驗證函式的回傳值會存在EAX暫存器中,if陳述句通過以下指令實作
mov [esp+41Ch], eax //將eax暫存器的值放入[esp+41Ch]記憶體地址中,eax32位暫存器
cmp dword ptr [esp+41Ch], 0 //將[esp+41Ch]記憶體地址的雙字型資料和0進行比較
je short loc_401588 //如若等于0跳轉到密碼確認流程,非0不跳轉,執行密碼重輸流程
- 如果我們將je這條指令修改位jnz(非0則跳轉),那么整個程式的邏輯就會放過來,輸入錯誤的密碼會被確認,輸入正確的密碼反而要求1重新輸入,雙擊這條指令,修改成jnz,點擊"Assembly",確認修改,寫入記憶體,會發現原來的機器指令74變為75,jump is taken提示跳轉將要發生,

LordPE
- 將.exe用LordPE打開,查看PE檔案的節資訊,求出跳轉指令在檔案的偏移地址

- 用 相對虛擬記憶體地址 減 檔案偏移地址 得到 節偏移地址
- 計算指令偏移地址等于之前得到相對偏移地址減去映射地址(exe的映射地址默認是0x00400000)再減去節偏移地址
檔案偏移地址 = 相對偏移地址 - 裝載基址 - 節偏移地址
= 0x00401578 - 0x00400000 - (0x00001000 - 0x0000400)
= 0x978
- 計算得到這條指令在距離檔案開始處的978h,用16進制編輯器進行修改
Hex Workshop
- 將.exe檔案用hex wordshop打開,ctrl+g搜索978(16進制),將值74(JE)修改為75(JNZ),保存后重新運行可執行檔案(可能會將.exe變成.bak檔案,將.bak后綴修改為.exe運行即可)

- 運行結果如下,當輸入正確密碼"1234567"后,反而會被提示錯誤

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514120.html
標籤:訊息安全
