這次下手的是乙個用 mfc 寫的小 crakeme,是幾天前乙個朋友寫的。和上一次那個比較,這次的難度要高一點,剛拿到手的時候搞了好久都沒有什麼進展,我真是菜的不行~還好,過了這一兩天,算是小小進步了一點,拼了乙個下午和傍晚終於給搞明白了。像上次一樣,這次主力依然是 od,不是我。
首先執行一次看看
輸入密碼錯誤,彈出個「false」,大概也就這樣。直接 od 載入(當然我也用 ida 看了一下,不過也沒看出個什麼大概),先來個全圖
當然從這裡什麼也看不出,我們直接搜字串,找到的一些有用的字串如下
很自然可以想到,輸入正確密碼會彈出「good」。挑乙個雙擊跳過去
跳過來後直接就看到了關鍵跳,先下個斷再說,雖然離這裡還老遠。然後往上翻,在位址 003f7800 行下個斷,然後就可以直接 f9 執行了。f9 後,隨便輸入乙個假碼,然後程式果然斷在了設斷處
往下 f8 粗跟一下,同時觀察資訊視窗和暫存器。過了位址 003f7871 行的乙個 call 時,發現 ecx 暫存器中攜帶了我們輸入的密碼的位址,那想是來這個 call 讀取了我們輸入的密碼。ctrl+f2 重來一遍,在這個 call 跟進去,果然發現了 getwindowtextw 呼叫。
同時要注意,這裡呼叫的是 getwindowtextw 函式,不是 getwindowtexta 函式,這說明程式是把我們輸入的字元當做寬字元讀入的。在 ecx 暫存器上右鍵,「資料視窗中跟隨」,然後觀察資料視窗
ok,注釋完繼續往下跟,注意此時資料視窗還顯示我們輸入的密碼,我們一邊跟一邊觀察這個密碼是否有變化。在過了位址 0037787a 行的 call 之後,我們發現輸入的密碼改變了。
在這個 call 上下個斷,ctrl+f2 重來,在這個 call 跟進去。然後先不單步執行,我們先往下看看有沒有什麼比較可疑的指令。果然,在位址 003f7fc6 行,我們看見一條異或指令,「 xor ecx,edx 」,這個應該很關鍵,下個斷。然後找那幾個跳轉指令點著看看,有往後跳的也有往前跳的,這樣的框架有點經驗的人就應該知道了,這個乙個迴圈。好了,獲取了足夠的資訊,我們就可以單步分析了。
不過這裡我就不詳細分析了,大概說一下就好。這個迴圈的作用是,把輸入的使用者名稱的每乙個字元與其對應的下標做一次異或運算,要注意的是,下標是從 1 開始算,不是從 0 開始算的,就這麼簡單。迴圈計數器從 0 開始,+ 1 後用作每一次異或運算時的下標。當計數器大於等於密碼長度時,跳出迴圈。
還有,在迴圈中位址 003f7f95 行有乙個 call,這個 call 的作用是取得乙個字串的長度。這裡的字串自然是我們輸入的密碼了
在位址 003f7fb0 的 call 的作用是從字串中取得即將運算的字元
在位址 003f7fd2 的 call 的作用是將運算的結果替換到字串中
這個迴圈就這樣子。對了,想要快速找到字串被修改的那一部分,可以試試「記憶體寫入斷點】,很好用。從這個 call 出去,回到外面的指令,繼續往下分析。
在位址 003f7884 行,在資訊視窗中發現了乙個字串,"helloeveryone"
繼續往下分析,在位址 003f78a1 行有乙個 call,這個 call 的作用和上面那個迴圈是一樣的,將 "helloeveryone" 與其對應的下標做異或運算,生成另乙個字串 "igohjcqm;
// 最後生成的密碼如果和 realpsw 相同,則輸入的密碼正確
// realpsw 在程式內部常量存在
string realpsw = ;
for (string::size_type i = 0; i < stra.size(); ++i)
}} cout << "輸入的密碼必須是 13 個位元組長,並且:" << endl << endl;
for (int i = 0; i < 13; ++i)
cout << endl << endl;
} cout << "注意!以上輸出可組合出大部分正確密碼,但應該仍有少部分遺漏!" << endl << endl;
return 0;
}輸出的正確的密碼就不貼出了,讀者可以自己寫程式求解,或者直接複製我的原始碼執行一次。那這一次就到這裡吧。
end.
初學者談初學者學html
這是乙個段落。解釋一下就是 html 與 html 之間的文字是描述網頁。head 與 head 之間的文字是文件的元資料。title 與 之間的文字是文件的標題。body 與 body 之間的文字是可見的頁面內容,是文章的主體部分。h1 與 h1 之間的文字被顯示為乙個大標題。p 與 p 之間的文...
Schema初學者高階 2
簡化schema的設計 在我們上次的練習中,設計schema所使用的方法是極其簡單的。由於使用層層巢狀的的定義方法,當文件非常複雜時,由於巢狀層次過深,文件將不易閱讀並且難以維護。同時這種方法和過去dtd的設計結構有非常大的差異,這使得人或者機器想把dtd轉換成xml schema時會有困難。因此,...
go初學者筆記(2)
fmt.printf 請輸入 n fmt.scan 可以a 或 a 但 a a 報錯package main import fmt func main else if num 10else less 10switch var1 switch預設每個case中都是break 如果需要穿透,加fallt...