逆向project实战--Acid burn
0x00 序言
這是第二次破解 crackme 小程序,感覺(jué)明顯比第一次熟練。破解過(guò)程非常順利,差點(diǎn)兒是分分鐘就能夠找到正確的 serial,可是我們的目標(biāo)是破解計(jì)算過(guò)程。以下將具體介紹。
0x01 初次執(zhí)行
剛開(kāi)始拿到 crackme 先執(zhí)行程序。看看有哪些明顯的特征。或者有哪些任務(wù)須要完畢:
雙擊程序后彈框,顯然第一個(gè)任務(wù)就是把這個(gè)框框弄掉,我們繼續(xù)執(zhí)行:
這個(gè)小程序比上次的要復(fù)雜,有兩個(gè) serial ,我們先看看左邊的:
不出意外。猜錯(cuò)了,有明顯的彈框和失敗字符串作為特征。我們接著看右邊的:
不出意外,再次失敗,依舊是彈框。
0x02 開(kāi)始調(diào)試
1、明白目標(biāo)
通過(guò)上面的執(zhí)行分析,我們須要干掉第一個(gè)彈框,以及興許的兩個(gè) serial 。同一時(shí)候我們發(fā)現(xiàn)三者的共同特征為彈框。所以首先攔截彈框函數(shù):
右鍵代碼區(qū)選擇 “serach for” => “All intermodules calls”:
在新窗體中輸入 messageboxa,右鍵。選擇”Set breakpoint on every call to MessageBoxA”:
這樣我們就給全部調(diào)用彈框函數(shù)的地方下了斷點(diǎn),接著回到代碼區(qū)執(zhí)行程序。
2、調(diào)用者
按 F9 執(zhí)行到彈框函數(shù)處,我們發(fā)現(xiàn)此時(shí)的棧頂就是第一次彈框時(shí)的字符串的地址,于是我們須要找到那個(gè)調(diào)用彈框函數(shù)的函數(shù)。叫做調(diào)用者。
這里我們往上看,找到當(dāng)前這個(gè)函數(shù)的入口并下斷點(diǎn):
然后我們 Ctrl + F2 又一次加載程序。F9 執(zhí)行到剛才下斷點(diǎn)的入口:
此時(shí)棧頂就是調(diào)用者執(zhí)行call指令時(shí)保存的返回點(diǎn)。我們?cè)诖a區(qū)中查找這個(gè)地址(42F79C),注意單擊代碼區(qū),按 Ctrl + G 進(jìn)行查找:
看見(jiàn)了嗎,就是這個(gè)函數(shù),僅僅有幾句代碼。以下我們就來(lái)消滅它。
3、去掉彈框
調(diào)用了函數(shù)才會(huì)彈框,我們的想法就是讓它不調(diào)用函數(shù),那么直接讓函數(shù)返回是最簡(jiǎn)單的方式。于是我們把函數(shù)入口處的第一條指令改成RETN 就可以:
單擊指令,按一下空格鍵能夠改動(dòng):
此時(shí)我們能夠把改動(dòng)保存到文件里:
右鍵指令,選擇 “Copy to executable” => “selection”:
在新窗體中右鍵選擇 “Save file”:
然后保存:
執(zhí)行新的程序發(fā)現(xiàn)第一次的彈框成功消失。
4、破解右側(cè)serial
接下來(lái)我們轉(zhuǎn)到右邊的 serial,輸入隨意字符串。然后點(diǎn)擊button:
我們發(fā)現(xiàn)程序停在了彈框函數(shù)的入口:
此時(shí)棧頂?shù)闹稻蛻?yīng)該是上級(jí)函數(shù)的返回地址:
我們繼續(xù)在代碼區(qū)搜索此地址(42F509):
發(fā)現(xiàn)了嗎,有推斷條件。能夠看出是字符串比較函數(shù),我們?cè)O(shè)置斷點(diǎn)。F9 執(zhí)行究竟后又一次點(diǎn)擊button:
程序停在了斷點(diǎn)處。看看棧區(qū)。發(fā)現(xiàn)給函數(shù)的參數(shù)中的字符串:
破解起來(lái)確實(shí)非常輕松,字符串是固定的:Hello Dude!
5、破解左側(cè) serial
我們繼續(xù)執(zhí)行,轉(zhuǎn)到左側(cè)。輸入隨意字符串后點(diǎn)擊button:
依據(jù)剛才的方式找到調(diào)用者返回地址:42FB37
查找代碼區(qū):
發(fā)現(xiàn)字符串比較函數(shù)并下斷點(diǎn)。此時(shí)查看棧區(qū):
再往上看代碼區(qū):
我們能夠猜測(cè)出 serial 是 “CW-” + 某個(gè)數(shù) + “CRACKED”,中間的數(shù)是我們須要找的目標(biāo)。
6、真實(shí)的目標(biāo)
我們給 serial 生成函數(shù)的入口下一個(gè)斷點(diǎn),然后又一次點(diǎn)擊button執(zhí)行到斷點(diǎn)處 F8 單步走:
中間發(fā)現(xiàn)兩段代碼:
EAX = name[0] * 7 + name[1] * 0x10; EAX = name[3] * 0xB + name[2] * 0xE繼續(xù)向下執(zhí)行,發(fā)現(xiàn)另外一段代碼:
函數(shù)入口的以下有一句不起眼的代碼:
兩個(gè)結(jié)合起來(lái)就是:
EAX = name[0] * 0x29 * 2;后面我們發(fā)現(xiàn)調(diào)用字符串輸出函數(shù)之前 EAX 的值被置為那個(gè)內(nèi)存單元的值:
繼續(xù)往下調(diào)試結(jié)果就非常明顯了,第三段代碼才是我們要的。
0x03 雙重檢測(cè)
1、簡(jiǎn)單粗暴的 C語(yǔ)言
代碼例如以下:
執(zhí)行結(jié)果:
2、原程序檢驗(yàn)
0x04 總結(jié)
這個(gè)小程序左邊的 serial 和 name 的第一個(gè)字符有關(guān),而且字符串長(zhǎng)度不能小于4.
轉(zhuǎn)載于:https://www.cnblogs.com/yangykaifa/p/7396298.html
總結(jié)
以上是生活随笔為你收集整理的逆向project实战--Acid burn的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2999元起!Redmi K50至尊版发
- 下一篇: GRE Sub math 报名