Crackme逆向分析
逆向第一題,很簡單,分分鐘能搞定。題目大致是說找一個key,提示success就行。
Peid查一下沒有任何殼,是vc寫的程序,裏面沒有知名的算法。開始分析
錯誤的時候是這個樣子
首先這一點就能給我們以下幾點提示:
1此程序是vc寫的,那麼得到用戶輸入肯定是用到getdigitemtext系列函數,通過對函數下斷即可以得到用戶的輸入
2.比較字符串,提示錯誤的字符串爲done,查找字符串
3.失敗與成功都會彈出對話框,那麼同理也可也對messagebox系列函數下斷
4.……其他 的方法暫且不說
直接getdigitemtext下斷髮現斷不下,嗯嗯,後來查看程序的時候發現這個程序並不是調用了這個函數,而是他的同類型函數 GetWindowTextA,下斷點之後,截斷了用戶的輸入來到這個函數開頭:
0042BAA3 |. 8B4D 10 mov ecx,[arg.3]
0042BAA6 |. 6AFF push -0x1
0042BAA8 |. E8846BFFFF call CrackMe.00422631
0042BAAD |. EB0B jmp XCrackMe.0042BABA
0042BAAF |> 8B45 10 mov eax,[arg.3]
0042BAB2 |. FF30 push dword ptrds:[eax]
0042BAB4 |. 56 push esi
0042BAB5 |. E8E4EBFFFF call CrackMe.0042A69E
0042BABA |> 5F pop edi
0042BABB |. 5E pop esi
0042BABC |. 5D pop ebp
0042BABD \. C20C00 retn 0xC
,嗯嗯,直接單步掉,過幾個跳轉之後來到算法的地方:
00401420 . 6AFF push -0x1
00401422 . 68D0904300 push CrackMe.004390D0 ; SE 處理程序安裝
00401427 . 64:A1 0000000>mov eax,dword ptr fs:[0] ; 關鍵代碼
0040142D . 50 push eax
0040142E . 64:8925 00000>mov dword ptr fs:[0],esp
00401435 . 83EC 0C sub esp,0xC ; 保護現場
00401438 . 56 push esi
00401439 . 57 push edi
0040143A . 8BF9 mov edi,ecx
0040143C . 6A01 push 0x1
0040143E . E8FD3E0200 call CrackMe.00425340 ; 讀字符串給edx
00401443 . 6A00 push 0x0
00401445 . 8D4F 5C lea ecx,dword ptrds:[edi+0x5C]
00401448 . E895110200 call CrackMe.004225E2 ; 讀輸入字符串給eax
0040144D . 51 push ecx
0040144E . 8BF0 mov esi,eax
00401450 . 8BCC mov ecx,esp
00401452 . 896424 14 mov dword ptrss:[esp+0x14],esp
00401456 . 68CCA04400 push CrackMe.0044A0CC ; strawberry
0040145B . E8C00D0200 call CrackMe.00422220
00401460 . E81BFFFFFF call CrackMe.00401380 ; 讀入一系列key做運算
00401465 . 83C4 04 add esp,0x4
00401468 . 8D4C24 0C lea ecx,dword ptrss:[esp+0xC]
0040146C . 50 push eax
0040146D . E8AE0D0200 call CrackMe.00422220
00401472 . 8D4C24 0C lea ecx,dword ptrss:[esp+0xC]
00401476 . C74424 1C 000>mov dword ptr ss:[esp+0x1C],0x0
0040147E . E8CF120200 call CrackMe.00422752
00401483 . 6A00 push 0x0
00401485 . 8D4C24 10 lea ecx,dword ptrss:[esp+0x10]
00401489 . E854110200 call CrackMe.004225E2
0040148E . 50 push eax
0040148F . 8D4C24 0C lea ecx,dword ptrss:[esp+0xC]
00401493 . C640 09 4B mov byte ptrds:[eax+0x9],0x4B
00401497 . E8840D0200 call CrackMe.00422220
0040149C . 8D4C24 08 lea ecx,dword ptrss:[esp+0x8]
004014A0 . C64424 1C 01 mov byte ptrss:[esp+0x1C],0x1
004014A5 . E8A8120200 call CrackMe.00422752
004014AA . 6A00 push 0x0
004014AC . 8D4C24 0C lea ecx,dword ptrss:[esp+0xC]
004014B0 . E82D110200 call CrackMe.004225E2
004014B5 > 8A10 mov dl,byte ptr ds:[eax] ; 判斷成功的代碼
004014B7 . 8ACA mov cl,dl ; 查看比較就知道是上面出現過的key
004014B9 . 3A16 cmp dl,byte ptr ds:[esi]
004014BB . 75 1C jnz XCrackMe.004014D9
004014BD . 84C9 test cl,cl
004014BF . 74 14 je XCrackMe.004014D5
004014C1 . 8A50 01 mov dl,byte ptr ds:[eax+0x1]
004014C4 . 8ACA mov cl,dl
004014C6 . 3A56 01 cmp dl,byte ptr ds:[esi+0x1]
004014C9 . 75 0E jnz XCrackMe.004014D9
004014CB . 83C0 02 add eax,0x2
004014CE . 83C6 02 add esi,0x2
004014D1 . 84C9 test cl,cl
004014D3 .^ 75 E0 jnz XCrackMe.004014B5
004014D5 > 33C0 xor eax,eax
004014D7 . EB 05 jmp XCrackMe.004014DE
004014D9 > 1BC0 sbb eax,eax
004014DB . 83D8 FF sbb eax,-0x1
004014DE > 85C0 test eax,eax
004014E0 . 6A 00 push 0x0
004014E2 . 6A 00 push 0x0
004014E4 . 75 07 jnz XCrackMe.004014ED
004014E6 . 68 E0A04400 push CrackMe.0044A0E0 ; success
004014EB . EB 05 jmp XCrackMe.004014F2 ; 破解完成
004014ED > 68 D8A04400 push CrackMe.0044A0D8 ; Done
破解過程直接看註釋吧,比較累,所以寫的比較簡單,沒有仔細分析算法。
嗯嗯,破到這個地方,看看堆棧,發現暫停堆棧分析也能秒破這個程序
0018F830 00422761 CrackMe.00422761
0018F834 01D3D8E8 ASCII "K$q*a_+@Xt"
0018F838 01D3D848 ASCII "123456"
0018F83C 00000000
0018F840 0018FE6C
0018F844 0043B890 CrackMe.0043B890
0018F848 01D3D8E8 ASCII "K$q*a_+@Xt"
0018F84C 01D3D898 ASCII "tX@+_a*q$K"
分析結束,大牛勿噴!
Reverseme逆向分析
題目只記得大致意思,是說有一個文件.db被這個程序加密了,要想得到key就要麼逆向這個加密程序的算法,然後自己寫解密程序解密,要麼用這個軟件修復裏面的bug運行兩次就可以得到key(坑爹的提示,反正我沒有運行兩次就整出來了)
同樣peid查出無殼,沒有加過殼,運行這個程序:
嗯嗯,根據提示,肯定是裏面某個函數傳參出了問題。
OD載入,剛入口就有這個messagebox,一開始參數出現了錯誤。
0040103D>/$ 68 10304000 push ReverseM.00403010
00401042 6A 01 push 0x1
00401044 |. E873010000 call ReverseM.004011BC
00401049 |. 83F8 01 cmp eax,0x1
0040104C |. 7414 je XReverseM.00401062
0040104E |. 6A00 push 0x0 ; /Style =MB_OK|MB_APPLMODAL
00401050 |. 681D344000 push ReverseM.0040341D ; |Title = "提示"
00401055 |. 6810344000 push ReverseM.00403410 ; |Text = "輸入參數錯誤"
0040105A |. 6A00 push 0x0 ; |hOwner =NULL
0040105C |. E847010000 call<jmp.&user32.MessageBoxA> ; \MessageBoxA
跟進Reverse,.004011BC,發現這個函數實際上是在讀這個軟件的路徑,但是沒有成功。(算法分析過,結果最近手殘OD清空過一次,算法沒了,有興趣的可以自己下去分析,)用IDA分析的算法差不多是下面這個樣子:
將讀出的路徑寫到00403010去,這裏管不管都行,,因爲程序的大致思路是在下面的readfile讀出來,然後在write回去。加上pass.db把參數push0x1改爲 push 0x0(這個時候會讀reverseme.exe)。
單步到這個地方:
00401089 |. 6A00 push 0x0 ;/pFileSizeHigh = NULL
0040108B |. FF35 00304000 push dword ptr ds:[0x403000] ; |hFile = 0000005C
00401091 |. E8EE000000 call<jmp.&kernel32.GetFileSize> ; \GetFileSize
00401096 |. A304304000 mov dword ptrds:[0x403004],eax
0040109B |. 6A04 push 0x4 ; /Protect = PAGE_READWRITE
0040109D |. 6800100000 push 0x1000 ; |AllocationType= MEM_COMMIT
004010A2 FF35 FA2F4000 push dword ptrds:[0x402FFA]
004010A8 |. 6A00 push 0x0 ; |Address = NULL
004010AA |. E8E1000000 call<jmp.&kernel32.VirtualAlloc> ; \VirtualAlloc
發現virtualalloc在分配內存的時候分配了0字節(關於這個api不懂的可以百度或者msdn),往上面瞅瞅,剛好有GetFileSize,將參數傳遞給他,然後繞過這個bug
然後哈,文件就可以正常的讀進來了
(這個地方其實是已經得到的正確的key,貌似之前讀進來的是一堆asc值好像,記不太清了)同理,繞過下面的bug,然後key就是剛剛那個了。
關於程序入口處第一個messagebox,是要修改跳轉的,如果不修改跳轉,而把參數0x1改爲0x0,發現讀進來的是
然後messagebox是沒有異常存在了,但是下面那個分配內存的地方還是會出錯,然後修改一下,在createfile和readfile之後文件夾中多了這麼一個文件
Winhex分析之後實際上就是這個.exe的代碼
熟悉的PE結構,然後下面寫之後變成這樣
哈,分析上面的之後加密算法就可以找出來了。然後找出來之後同樣可以對.db解密。
至此,分析完畢,大牛勿噴!
inject
第三個程序:inject:
依然沒有殼,想到病毒,第一反應是PE結構,然後也神馬都不懂的就winhex了一下,結果啥子都不曉得。管他,運行一下,尼瑪啊,啥都沒有。看看資源管理器,並沒有inject的進程。估計是被玩壞了的樣子。
OD載入一下,沒的啥思路,看了看字符串,嗯?
提示啊,來到這個函數地方
開始沒搞懂這個是神馬傑寶,代碼並沒有分析完全,然後分析了一下代碼弄成這個樣子:
0043E005 . 6A00 push 0x0
0043E007 . 685BE04300 push Inject.0043E05B ; Key?NO!
0043E00C . 682BE04300 push Inject.0043E02B ; A02B8DE7F2BCD4ED
0043E011 . 6A 00 push 0x0
0043E013 . E8F909A775 call kernel32.75EAEA11
0043E018 . 6A00 push 0x0
0043E01A E8 db E8
0043E01B 47 db 47 ; CHAR 'G'
0043E01C 62 db 62 ; CHAR 'b'
0043E01D 08 db 08
0043E01E 75 db 75
下面的OD還是沒法分析,不過同樣是call kernel32.75EAEA11(機器碼一樣)
在call的時候又一個A02B……的字符串,不過不是key,然後程序因爲被病毒感染,所以IAT應該受到破壞了,一運行程序就自己蹦掉
了。
然後想想看還有木有其他辦法:
程序從開頭直接跳到假碼,然後就直接崩了,所以直接把jmp給nop掉
發現了一些很有特徵的函數,GetVersion,GetCommandLine……,擦,c程序的入口啊,尼瑪跑下來,估計然後查一下字符串,發現了另外一個
坑爹啊,這貨就是!!!,但是是在sendmessagebox後面,估計會彈出來個什麼框框吧。
最坑爹的事情來了,尼瑪nop掉之後我還在程序裏面想怎麼讓他彈出個框,想了好久,每次還是會讓這個程序崩掉,後來覺得每次改一遍nop麻煩,就直接先把nop保存下來,然後無聊點了一下保存的文件,靠,直接彈框啊
沒道理啊,嗯,要去吃飯了,沒怎麼弄明白爲什麼保存之後程序可以正常運行了
,看這個樣子估計是程序裏面有反調試吧,在OD環境下不會正常運行。
分析完畢,大牛勿噴!!!
第4題題目忘記了
很遺憾當時第4題因爲在web上被卡住了未能做出來。第4道題轉自我的隊友:
下午做了一下,這一題共有兩個文件
那個exe打開後如下圖
看到那個圖片了麼,還有一串像key的數字,我猜那串數字一定不是key,而且也不是隱寫的題,要不然怎麼放逆向這邊了呢,所以咱還是要分析這個程序,經過幾番嘗試,知道源文件編輯框中輸入上邊這張圖,數據文件是你要加入的數據,用txt保存,目的文件是將以上兩個文件組合成第三個文件,所以這個目的文件也要是bmp文件。
點按鈕“開始隱藏”,會彈出“隱藏信息完畢!”的對話框,可這怎麼得到key呢,我們只有從圖片中提取key。
用IDA看看,
發現不但有“隱藏信息完畢!”,還有“提取信息完畢!”,找到引用該字符串的代碼,在401DD2處,向上翻,
有兩個CreateFile,然後又兩個ReadFile,又有一個WriteFile,發現CreateFile中的Filename是空的,應該就是那兩個特別小的編輯框了,用PE-Explorer將編輯框放大。
就可以輸入文件名了,可是怎麼到達這處代碼呢,看“開始隱藏”,
這部分功能代碼與提取信息的那部分代碼相似。
具體就不分析了,因爲無關緊要,直接改代碼,使它跳轉到提取信息的代碼處
保存運行:
這時候2.txt中就有key了,“B0ACD1BDA3FD1CD6”。