逆向-360逆向writeup

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”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章