因為放假的關係
所以最近都沒有人提問題的說... (好無聊在yahoo混也只能一天回8則)
因此
這裡來一篇最簡單的
密碼輸入破解教學
使用的工具有:
. OllyDbg v1.10、
. 自己用 C++寫的一個 密碼Pass判斷程式、
. Windows XP小算盤,請切換到工程模式、
. Dev-C++
C++程式如下
PHP 語法:
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[])
{
unsigned int c1, c2;
do {
c2=0;
system("cls"); //清除畫面
for(int i=0 ; i<5 ; i++){ //做 5碼密碼的判斷
while(!kbhit()); //直到 鍵盤有按下之動作才往下
c1 = getch(); //繼上∼當按下後讀入KeyCode值放到 c1變數中
if(c1>=48 && c1<=57){ //c1限制在 "0"~"9"
c1=c1-48; //將字元 轉成 數值 "0"的ASCII碼是 48,所以轉成數值是減 48
c2=c2*10+c1; //用c2做堆疊暫存
printf("*"); //印出 "*"號
}
}
}while(c2!=25518); //密碼是 25518,不符合則重新輸入
printf("\nPass word is %d\n",c2);
system("PAUSE");
return EXIT_SUCCESS;
}
開始實做:
.先將上述C++編譯成 .exe檔
.接著開啟 OllyDbg(以下用OD簡稱OllyDbg) 將 .exe檔拖進去
在此先做簡單的 OD介紹
可以看到一些 OD所分析出的 迴圈 結構
(如:圖一 之 綠色框框 皆是)
好∼接著不多說
我們按下播放鍵(也就是執行鍵或 鍵盤F9)執行一次
如預料中(程式設計成)
你可鍵入5個數字鍵密碼
不是 password就會清除畫面要求重新輸入
此時我們再鍵入一次 4個數字鍵的密碼
回到 OD 按下暫停鍵(或著 鍵盤F12)
.接著按住 F8或 F7 來步進執行
(兩著差別在 F8:反光條所指的指令到此已執行完成,F7:則是反光條所指的指令 還未執行)
可以看到程式一直在執行並跳來跳去
其中可發現有一個指令為 RETN
這是一個 "返回" 的動作
通常表示離開 副程式
所以我們就一直押著 F8 直到沒有出現 RETN 為止
(有一定的可能性 我們會碰到程式始終有 RETN 的情形,端看程式設計者的寫法而定
但在此我們不會碰到,所以不已討論例外情形)
此時會發現程式一直在一個圈子裡打鑽
判斷這很有可能是因為我們未完成程式所應達成的要求
比如 需輸入5個字但我們只輸入4個字,
還有一個可能就是 鍵盤等待輸入中(一般輸入密碼的裝置都是鍵盤)
在此教學實例中是在 以下四行中打鑽
語法:
004012DA E8 51050000 CALL <JMP.&msvcrt._kbhit> ; [_kbhit
004012DF 85C0 TEST EAX,EAX
004012E1 75 02 JNZ SHORT main.004012E5
004012E3 EB F5 JMP SHORT main.004012DA
要跳脫這個迴圈就表示會執行到下一行
語法:
004012E5 E8 36050000 CALL <JMP.&msvcrt._getch> ; |[_getch
所以我們在這一行設置程式中斷點 (請對這一行按 F2)
.接著按播放鍵繼續完成執行動作
也就是完成輸入 5個數字鍵密碼
如之前所猜測的一般:
程式跑到我們設的中斷點而自行 "暫停"
此時我們就改以按 F8
步進執行之
.一直執行下發現又回到剛剛的小迴圈了
此時看一下程式畫面果然密碼錯誤被清空了
所以我們需要放棄剛剛的中斷點 (對著該行再按一次 F2)
但
在此之前
先同上執行一次直到程式被中斷
此時取消剛剛的中斷點
.接著以一次按一下 F8方式
慢慢的看程式是如何回到 "小迴圈"的
經一行行的觀察下
主要是因為
語法:
0040132D EB 8B JMP SHORT main.004012BA
這一行而跳回上面的程式開頭
進而程式從上而下依序
一步步的跑回 "小迴圈"中
那為何會執行到這行呢?
JMP 是無條件跳躍,所以我們往上看到周遭幾行
發現一個比較指令 (及條件跳躍指令)
語法:
00401324 817D F8 AE6300 CMP DWORD PTR SS:[EBP-8],63AE
0040132B 74 02 JE SHORT main.0040132F
翻譯過來就是
記憶體位址 SS:[EBP-8]內的內容 與 63AE 比較
如果 等於
則跳到 main程式之 0040132F這個記憶體位址
執行
那我們就看到該位址後的程式段落
語法:
0040132F 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; ||
00401332 894424 04 MOV DWORD PTR SS:[ESP+4],EAX ; ||
00401336 C70424 0630400 MOV DWORD PTR SS:[ESP],main.00403006 ; ASCII 0A,"Pass word "
0040133D E8 6E050000 CALL <JMP.&msvcrt.printf>
00401342 C70424 1830400 MOV DWORD PTR SS:[ESP],main.00403018 ; ASCII "PAUSE"
00401349 E8 72050000 CALL <JMP.&msvcrt.system>
0040134E B8 00000000 MOV EAX,0
00401353 C9 LEAVE
00401354 C3 RETN
發現註解行有 "Pass word " 等字串顯示
又有
00401353 C9 LEAVE
及
00401354 C3 RETN
程式結束返回等用語 (不一定會有LEAVE啦)
所以大膽假設到此
密碼判斷Pass通過而結束程式
.所以會過頭來
CMP DWORD PTR SS:[EBP-8],63AE
就是在比對密碼
在此設置中斷點 (並清除之前的中斷點)
按下播放鍵
輸入 12345 之密碼
接著程式如我們所預料的在此中斷暫停了
借由 OD所標示
(即為圖一之白框註解所在地)
SS:[EBP-8] 內容是 00003039
恰巧是我們剛才輸入的值
(請用Windows XP小算盤輸入 12345 再按 "十六進位"即可得到 3039)
所以 63AE 就是密碼嘍
用小算盤翻成十進位是 25518
.當然最後就驗證看看 (為了順暢可以把中斷點清除掉)
按播放鍵
輸入 25518 ∼的確成功放行了
到此是一個簡單的密碼組合語言追蹤實驗
雖然講了很多
其實做過一次會發現一點都不難
當然在實驗外
想試著實作破解
並不是都會這麼順利
但這裡方法會了
有了觀念就只剩靈巧應用的問題了
因為是自己破自己的程式
所以不涉及市售軟體破解的衍伸問題
所以也不接受任何 軟體破解 的請求與討論
只針對這個例子作答覆
希望各位會喜歡
~END~
附件: (圖一 + main.exe + main.cpp)
http://d.turboupload.com/d/290521/pa...ugtest.7z.html
至於 OllyDbg v1.10 請至 WWW(google) 或 emule 等搜得 (或使用其他 除錯軟體)
沒有留言:
張貼留言