小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe
?
?
小甲魚 視頻教程(?4、5?集?):https://www.bilibili.com/video/av6889190?p=4
實驗程序 reverseME.exe?下載地址:https://pan.baidu.com/s/18NDV3rQ_yV_qzUrNRYmqjA ? ?提取碼:e91j?
http://www.360doc.com/content/16/0220/00/26186435_535858733.shtml
?
?
0. 前言
?
本系列為二進(jìn)制破解科普系列教程。教程面向新手愛好者,歡迎大家探討、建議,大牛輕噴。
?
?
1. 準(zhǔn)備工作
?
在學(xué)習(xí)之前,我們需要了解以下的內(nèi)容:
?
1.寄存器:
寄存器就好比是CPU身上的口袋,方便CPU隨時從里邊拿出需要的東西來使用。常見涉及到的九個寄存器:
?EAX : 擴展累加寄存器EBX : 擴展基址寄存器ECX : 擴展計數(shù)寄存器EDX : 擴展數(shù)據(jù)寄存器ESI : 擴展來源寄存器EDI : 擴展目標(biāo)寄存器EBP : 擴展基址指針寄存器ESP : 擴展堆棧指針寄存器EIP : 擴展的指令指針寄存器這些寄存器的大小是32位(4個字節(jié)),他們可以容納數(shù)據(jù)從0-FFFFFFFF(無符號數(shù)),除了以下三個寄存器,其他我們都可以隨意使用:
?EBP : 主要是用于棧和棧幀。ESP : 指向當(dāng)前進(jìn)程的棧空間地址。EIP : 總是指向下一條要被執(zhí)行的指令。?
2. 棧:棧是在內(nèi)存中的一部分,它有兩個特殊的性質(zhì):
圖示:
?
3. CALL指令
? ? call有以下幾種方式:
?
4. 系統(tǒng)API
? ? Windows 應(yīng)用程序運行在 Ring3 級別
API 函數(shù),我們也稱之為系統(tǒng)提供給我們的接口。因為系統(tǒng)只信任自己提供的函數(shù),所以我們要通過 API 才能實現(xiàn)對內(nèi)核的操作。
?
5. mov指令
mov 指令格式:mov?dest,?src。這是一個很容易理解的指令,mov 指令將 src 的內(nèi)容拷貝到 dest,
mov 指令總共有以下幾種擴展:movs/movsb/movsw/movsd?edi,esi:這些變體按串/字節(jié)/字/雙字為單位,將 esi 寄存器指向的數(shù)據(jù)復(fù)制到 edi 寄存器指向的空間。movsx符號位擴展,byte->word,word->dword?(擴展后高位全用符號位填充),然后實現(xiàn)mov。movzx零擴展,byte->word,word->dword(擴展后高位全用0填充),然后實現(xiàn)mov。
?
6. cmp指令
cmp 指令格式:cmp?dest,?src。cmp 指令比較 dest 和 src 兩個操作數(shù),并通過比較結(jié)果設(shè)置 C/O/Z 標(biāo)志位。
cmp 指令大概有以下幾種格式:
?
7. 標(biāo)志位:在破解中起到的作用是至關(guān)重要的。
在逆向中,你真正需要關(guān)心的標(biāo)志位只有三個,也就是 cmp 指令能修改的那三個:Z/O/C。
?
8. 邏輯運算
如圖:
?
9.test 指令
test 指令格式:test?dest,?src。這個指令 和 and 指令一樣,對兩個操作數(shù)進(jìn)行按位的 ‘與’ 運算,唯一不同之處是不將 ‘與’ 的結(jié)果保存到 dest。即本指令對兩個操作數(shù)的內(nèi)容均不進(jìn)行修改,僅是在邏輯與操作后,對標(biāo)志位重新置位。
?
10. 條件跳轉(zhuǎn)指令
條件跳轉(zhuǎn)指令,就是根據(jù)各種不同標(biāo)志位的條件判斷是否成立,條件成立則跳轉(zhuǎn)。
?
?
2. 破解 ReverseMe
?
按 F3 載入程序:
首先,我們來看看程序圖,我們先隨便的走一次,順便介紹對應(yīng)的名詞。
LoadIconA??: 圖片的圖標(biāo)
CreateFileA: 創(chuàng)建文件
當(dāng) 跳轉(zhuǎn)不實現(xiàn)的時候,就執(zhí)行下面的代碼段:
然后彈出消息框,結(jié)束進(jìn)程。
我們的目的是想讓他跳轉(zhuǎn)實現(xiàn),那我們怎么辦呢?就得跳過上面的代碼段,我們?nèi)绾蝸硇薷膶?yīng)的代碼段,來實現(xiàn)我們所要的效果呢?
要讓他跳轉(zhuǎn)實現(xiàn)的話,修改對應(yīng)的 Z=0 就實現(xiàn)跳轉(zhuǎn)。
這里已經(jīng)實現(xiàn)跳轉(zhuǎn)了,我們這節(jié)課肯定不像上面的課程那么簡單了,直接一步到位,我們這節(jié)課的話,需要跳轉(zhuǎn)幾個位置,要不然我們怎么能突破障礙呢?
那接下來,我們繼續(xù)走我們的調(diào)試文件!
ReadFile:讀取一個文件
這里我們要明白為什么要去ReadFile呢?因為這里的話,要去讀取一個密鑰的文件,所以這里才需要ReadFile。
-
?test 指令格式:test?dest,?src
-
?test 指令和 and 指令一樣,對兩個操作數(shù)進(jìn)行按位的‘與’運算,唯一不同之處是不將‘與’?的結(jié)果保存到dest。
-
?jnz條件跳轉(zhuǎn)
-
?jmp:無條件跳轉(zhuǎn)
一般我們想讓條件跳轉(zhuǎn)判斷的話,看如下圖:
我們又遇到一個跳轉(zhuǎn)未實現(xiàn)的值,其實在這里也是一個坑來的,那我們和上面一樣,讓他跳轉(zhuǎn)的值實現(xiàn)。同樣把寄存器區(qū)的Z值修改為 Z=0?從而達(dá)到跳轉(zhuǎn)的效果。
ebx 的值等于 0 的話可以看看寄存器上的 ebx 的值。
這里看到的是xor的條件判斷,對相應(yīng)的值清0
下面我們走到的密鑰區(qū),如下圖所示:
我們可以看到這里的跳轉(zhuǎn)已實現(xiàn),那想想這里是不是我們的第三個障礙呢?
分析到下面的語句,發(fā)現(xiàn)這里要是直接走下去的話,會誤人程序的陷阱,那我們的目的只能讓跳轉(zhuǎn)不實現(xiàn)了,j1的跳轉(zhuǎn)判斷的話,可以看我們上面的跳轉(zhuǎn)圖。要讓jl不實現(xiàn)的話,我們這里需要讓SF!=OF,從而達(dá)到我們想要的效果。
就可以達(dá)到跳轉(zhuǎn)不實現(xiàn),我們跳過這個障礙之后,我們繼續(xù)走,繼續(xù)看我們的程序。
繼續(xù)走我們的程序,我們又遇到一個跳轉(zhuǎn)已實現(xiàn)的,分析到下面的代碼,發(fā)現(xiàn)會跳轉(zhuǎn)到密鑰區(qū),所以我們繼續(xù)讓他不實現(xiàn)。看他的條件語句:
讓SF!=OF的值相等就行,那在這里修改S的值,讓S=1變?yōu)镾=0就可以達(dá)到所要的效果。
通過修改后,可以看到跳轉(zhuǎn)未實現(xiàn)。
接下來,我們繼續(xù)走我們的程序,走到j(luò)mp是無條件跳轉(zhuǎn),就讓他跳吧。
我們跳轉(zhuǎn)到這里的話,我們看到text里面的提示:You?really?did?it!?Congratz?!!!?提示你破解已經(jīng)成功咯。
是不是有點小小的激動呢?
?
?
以上都是?根據(jù)??[魚C]小甲魚主講OD使用教程(第4、5集):https://www.bilibili.com/video/av6889190/?p=4
?
?
?
總結(jié)
以上是生活随笔為你收集整理的小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章带你领悟 Frida 的精髓(基
- 下一篇: OFD文件结构--Signatures.