2008年8月10日 星期日

密碼輸入破解教學

密碼輸入破解教學

因為放假的關係
所以最近都沒有人提問題的說... (好無聊在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 等搜得 (或使用其他 除錯軟體)



mini 目前離線

沒有留言: