1. 程式人生 > >reversing.kr 開坑(目前完成19題)暫時斷更,自閉ing……

reversing.kr 開坑(目前完成19題)暫時斷更,自閉ing……

肝就完事了……

1.Easy Crack

拖進IDA

四段拼起來就好。注意順序

2.Easy Unpack

讓我們找OEP,OD啟動

直接OEP定律就好

3.Easy Keygen

Find the Name when the Serial is 5B134977135E7D13

拖進IDA

關鍵操作就是一個異或,如下

3步一輪迴,金鑰盒子[0x10,0x20,0x30]

唯一可能誤導的就是那是一個位元組一個位元組異或的,而不是一個字母一個字母異或的

4.Easy ELF

看見做出來的人很多,就先做了

拖進IDA,稍微分析一下

其實就是你輸入的字串要滿足check函式,看一下check函式

easy

s=chr(120^0x34)+chr(49)+chr(124^0x32)+chr(221^0x88)+chr(88)                                  
print(s)

5.Replace

開啟是一個exe

IDA拖進去貌似很奇怪,但並沒有殼,直接OD

靠字串定位到判斷處

分析了一波之前多有的跳轉和判斷,總覺得不可能跳轉到correct,而且我只能輸入數字,基本就是把那兩個阻礙我們跳轉到correct的jump解決掉應該就可以了

收完訊息之後判斷函式應該就是40466F,跟進去看一下,最後就是jmp 到401071,所以我們需要通過我們輸入的值讓401071變成nop,但是在這段區域單步除錯的時候還是炸了,裡面40466F又炸了一次,再次跟進去

這裡就是傳遞一個nop指令(0x90),那我們把eax改成401071就可以了,此時eax是60160646,輸入是123

如果輸入的是0,eax是601605CB,正好相差123,nice,那我們輸入2687109798就可以吧eax改為0x401071了

6.Music Player

應該是隻要bypass就可以看見flag了

用peid的時候發現這個是vb,直接瑞彈窗框在OD中下斷點

第一次卡死,暫停看堆疊,發現box在4045D8,向上翻有個跳轉語句,直接改成jmp如下

然後執行到最後,又有個彈窗

老樣子,一樣的操作就好

然後在MP3 Player的地方會出現password

7.CSHOP

開啟後就是如圖所示,很詭異,不知道要幹嘛,PEID一波,發現是C#

直接dnspy反編譯看看咋回事

這咋看,看不懂啊……在裡面慢慢找吧

最後在資源裡面看到了一個button,eng?還有按鈕,仔細一看,大小被調成0了,還有tabindex=0,按空格鍵相當於點選按鈕

點選一下空格出現答案

8.Flash Encrypt

因為是flash,很好奇,就來看看,結果發現有現成的工具ffdec,反混淆之後直接按照提示輸入數字就好…………

數字:1456,25,44,8,88,20546

9.HateIntel

一道蘋果的,IDA真的tql,還是可以反編譯,題目提示如下

靠字串定位到關鍵函式,如下

先看一下dict(byte_3004)

232C就是加密函式,跟進去

顯然看出來要加密4輪,而且每輪最後一部分不用加密,跟進2494

或運算,是個不可逆的操作,看來只能爆破了

指令碼

s=[0x44, 0xF6, 0xF5, 0x57, 0xF5, 0xC6, 0x96, 0xB6, 0x56, 0xF5, 0x14, 0x25, 0xD4, 0xF5, 0x96, 0xE6, 0x37, 0x47, 0x27, 0x57, 0x36, 0x47, 0x96, 0x03, 0xE6, 0xF3, 0xA3, 0x92]

flag=''

def cal(key):
    for i in range(32,256):
        k=i
        for j in range(4):
            tmp=2*k
            if(tmp&0x100):
                tmp|=1
            k=tmp%256    #python margin
        if(k==key):
            return chr(i)

for i in range(len(s)):
    flag+=cal(s[i])

print(flag)

10.ImagePrc

我自己覺得是很詭異的一道題

這啥東西,先看一下有沒有殼,無殼,拖進IDA

靠一個wrong,找到核心程式碼,前後看了看,這都是啥……

大概能看懂的就是這句註釋,跳出來一個錯誤的彈窗,那麼判斷應該在前面不遠處吧……應該就是上面的while和if吧

然後再之前又找到了一塊程式碼

百度了一下BeginPaint是準備畫圖,那應該是圖片的比較吧……這題真的是迷茫,看不太懂,只知道寬200,高150

先把程式裡面的圖片dump下來吧,這裡用exescope

直接上python指令碼,這指令碼我是看不懂的,但是很有用,漲姿勢了,可以學一首python對圖片的操作,直接python3跑哦

from PIL import Image
 
width = 200
height = 150
 
image_file = open('_dump', 'rb')
data = image_file.read()
image = Image.frombuffer('RGB', (width, height), data, 'raw', 'RGB')
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.show()
image_file.close()

結果如下

11.Direct3D FPS

看上去像是射擊類遊戲?

我打人不掉學,他也不打我,不會玩

拖進IDA,靠字串定位

比較有用的應該就是這個byte_407028了,檢視一下交叉引用

看見有一個異或操作

先看一下409184處的字典,靜態狀態下是未知的,看一下407028出的字典,存在

這裡耍了一個小花招,其實403440函式只能返回0或者-1,0的時候才能運作,所以其實v2=0,當作i就好了,easy

s=[0x43, 0x6B, 0x66, 0x6B, 0x62, 0x75, 0x6C, 0x69, 0x4C, 0x45, 0x5C, 0x45, 0x5F, 0x5A, 0x46, 0x1C, 0x07, 0x25, 0x25, 0x29, 0x70, 0x17, 0x34, 0x39, 0x01, 0x16, 0x49, 0x4C, 0x20, 0x15, 0x0B, 0x0F, 0xF7, 0xEB, 0xFA, 0xE8, 0xB0, 0xFD, 0xEB, 0xBC, 0xF4, 0xCC, 0xDA, 0x9F, 0xF5, 0xF0, 0xE8, 0xCE, 0xF0, 0xA9]

flag=''

for i in range(len(s)):
    flag+=chr(s[i]^(i*4))

print(flag)

Congratulation~ Game Clear! Password is Thr3EDPr0m

12.Position

看一下提示

題目多解,只有四位,最後一位是p

開啟exe,是一個經典的crackme

拖進IDA,沒有找到有用的字串

不死心,換OD重新找

找到了,很奇怪,那回IDA重新找就找到了,如下

401740應該就是check函數了,跟進去看……

輸入的name要是4位,而且要是小寫的字母,我們已經知道1位了,繼續看下面的邏輯

這樣的有四段,name[0]~name[3],全是位運算,爆破

先爆破第一段

serial='76876-77776'

for i in range(ord('a'),ord('z')+1):
    for j in range(ord('a'),ord('z')+1):
        v6 = i #name[0]
        v7 = (v6 & 1) + 5
        v48 = ((v6 >> 4) & 1) + 5
        v42 = ((v6 >> 1) & 1) + 5
        v44 = ((v6 >> 2) & 1) + 5
        v46 = ((v6 >> 3) & 1) + 5
        
        v8 = j #name[1]
        v34 = (v8 & 1) + 1
        v40 = ((v8 >> 4) & 1) + 1
        v36 = ((v8 >> 1) & 1) + 1
        v9 = ((v8 >> 2) & 1) + 1
        v38 = ((v8 >> 3) & 1) + 1

        if (v7 + v9==int(serial[0]))and(v46 + v38==int(serial[1]))and(v42 + v40==int(serial[2]))and(v44 + v34==int(serial[3]))and(v48 + v36==int(serial[4])):
            print(chr(i)+chr(j))

結果如下

bu
cq
ft
gp

直接猜答案啊bump  撞擊

13.Ransomware

原檔案是exe

這是什麼鬼呀…………

upx殼,脫掉

拖進IDA

emmmmmm,也太秀了吧,雖然我很菜,我也能看出來這些都是花指令

這裡我的IDA編譯過來有點問題,不過是能看出來是pushad和popad,寫指令碼去花

先把這些彙編指令轉成16進位制數

from pwn import *
shellcode='''
pushad;
popad;
nop;
push eax;
pop eax;
push ebx;
pop ebx
'''
flag=''
shellcode=asm(shellcode)
for i in shellcode:
    flag+=str(hex(ord(i)))

print flag.replace('0x','\\x')

#\x60\x61\x90\x50\x58\x53\x5b

搞定之後再寫個指令碼把這些替換成nop(\x90)

data = open('run.exe','rb').read()
data = data.replace('\x60\x61\x90\x50\x58\x53\x5b','\x90\x90\x90\x90\x90\x90\x90')
open('run_new.exe','wb').write(data)

再次拖進IDA分析,發現還是太大

之後改下main()的起始地址  改到nop指令結束的位置   再改下使堆疊平衡就可以F5了

開啟之後開頭就是開啟檔案再改之類的,既然都是nop就先不管了

加密的函式應該就是如下這塊,能看出來是一個異或外加取反的操作

但是byte都是不可見的,要想辦法找出來,畢竟沒有金鑰什麼是也幹不了

提示說用file來解密,而且file是個exe,看看有啥東西拿來到金鑰,我一般性是喜歡直接用最後的字串的,因為對應的一定都是0,很方便

偷個懶,直接最後一行

s=[0x97, 0x9A, 0x8C, 0x8C, 0x93, 0x9A, 0x8B, 0x8C, 0x8F, 0x93, 0x9E, 0x86, 0x9C, 0x97, 0x9A, 0x8C]
#all they corresponding are 0
for i in range(len(s)):
    print(chr((0xFF^s[i]^0)%256),end='')

金鑰應該是有意義的,我猜測應該是letsplaychess

拿到金鑰解密回去就好了

data_c = open('file','rb').read()
data_d=''
key='letsplaychess'
key_len = len(key)
for i in range(len(data_c)):
    data_d += chr(ord(key[i%key_len])^(~ord(data_c[i]))&255)

open('file.exe','wb').write(data_d)

本題參考:https://veritas501.space/2017/03/04/Reversing.kr%20writeup/

14.AutoHotkey1

答案估計是兩個md5當中用空格連線

查殼發現有upx,脫殼後執行

拖進IDA搜尋字串

繼續檢視4508C7函式,是個自校驗函式,直接改跳轉跳過就好

但是有一個細節,在自校驗函式中,有一個函式450ABA,被多次呼叫,很可疑,檢視一下,一大堆位運算,非常疑似加密函式,如下

直接在OD中對它下斷(未脫殼),防止跑飛,我還在之後的retn下斷了,經過多次F9,感覺實在這個函式迴圈了一會兒,出現瞭如下的字串

md5解密後得到:pawn

答案是靠譜的

這個是我們運算過後的,所以這只是一半,還有一半應該實在運算前

我們可以在第一次運算前直接檢視EDI,發現並沒有,但總要有個地方吧,一邊解密一邊檢視左右暫存器,在第一次執行完後的EBX找到了,如下

md5解密:isolated

搞定,拼起來記得加空格

15.x64 Lotto

eng?奇怪,是個exe

貌似peid不太支援x64查殼,我選擇直接拖入IDA

這段wsystem('cls')意思是清屏,我們可以輸入六個整數,所以我們輸入什麼都不為所動

判斷方法如下

基本就是這麼個流程,還算比較清晰,接下來就是生成flag的操作

接下來是一段異或操作,有點麻煩的就是,需要異或的位元組的實際順序和存放順序是不一致的,好在IDA幫我們寫了標號,算是幫大忙了,不用去動態除錯了,大概流程如下

s= [184, 92, 139,  107, 66, 184, 56, 237, 219, 91, 129, 41, 160, 126, 80, 140, 27, 134, 245, 2, 85, 33, 12, 14, 242]
d = [231, 51, -11, 20, 62, 221, 91, 191, 204, 52, 231, 51, -11, 20, 62, 221, 91, 191, 204, 52, 68, 100, 20, 73, -12]
for i in range(len(d)):
    if(d[i]<=0):
        d[i] = d[i] + 256
for i in range(len(s)):
    print (chr((s[i] ^ d[i] ^ 0xF) + i),end='')

後來貌似看大佬的做法發現是可以動態除錯的,我用x64dbg試試看,我佛了,直接nop,jmp爆破搞起來啊,或者用IDA也可以

後來發現還是IDA好用,真香

16.WindowsKernel

顧名思義,我應該是腦子被搶打了,才來看核心的題目,主要是好奇,從來沒接觸過

萬幸還算是有提示:

請對小寫進行身份驗證,不知道啥意思,但是可以知道有身份驗證

一開始是驗證不通過的

在IDA裡面搜尋字串也沒搜出個什麼,萬幸函式比較少,一個個看,看到個類似於檢驗的函式

判斷的關鍵就是函式401280,跟進去看一下

DeviceIoControl如果操作成功完成,DeviceIoControl將返回一個非零值

基本上可以看出來,如果指令是0x1000,進入check模式,當指令為0x2000,判斷正誤

咋辦呀,看看別的函式吧

首先看到了一個hint

沒思路了,難受……

17.PEPassword

這道題目開啟以後發現了兩個exe,根據題目名字猜測,一個是加密前的原始檔案,另一個是加密後的檔案

先看一下PEID,要是是個有名的殼,直接脫就行了,不BB,不過既然給了原始檔案,那肯定沒這麼容易

這是啥,打擾了

開啟Packed.exe,只有一個輸入密碼的地方,沒有空間,下斷點就比較困難了,不過總能找到的,OD啟動

注:bp TranslateMessage MSG==WM_KEYDOWN,WM_KEYDOWN是windows鍵按下訊息——WM_KEYDOWN

同時我們還可以看見執行第一條指令的時候程式就啟動了,所以一開始就直接F7

可以看到這裡有個getmessageA,要極度小心,這裡而且是一個迴圈體,很有可能就是讀入輸入資料的地方,這個je回撥到迴圈體之外,可以理解為check失敗了

而且這裡有兩個函式值得注意:

1)TranslateMessage----函式功能描述:將虛擬鍵訊息轉換為字元訊息。字元訊息被送到呼叫執行緒的訊息佇列中,在下一次執行緒呼叫函式GetMessage或PeekMessage時被讀出

2)DispatchMessage----該函式排程一個訊息給視窗程式。通常排程從GetMessage取得的訊息。訊息被排程到的視窗程式即是WindowProc函式。windowProc函式是一個應用程式定義的函式。它處理髮送給視窗的訊息

In conclusion:TranslateMessage函式將鍵盤訊息轉化,DispatchMessage函式將訊息傳給窗體函式去處理

對著這一塊在IDA裡面分析,不過這次不能F5,直接看彙編,稍微硬核一些

這裡402A3E是cmp要關注,而且還有交叉引用,看一下

用了edi的值,動調跟一下,在前面一點下斷點

到409197時,在esi中出現了我們輸入的資料xiaoyuyu,猜測函式4091D8就是校驗函式,在IDA中,只能看到一個xor從左,如下

只能跟進OD看,之後有個判斷是用eax與0xE98F842A判斷是否相等

在函式裡看了半天還是直接爆破算了,看不懂啊……這輩子都看不懂的

關鍵的操作函式從409200開始

其實就是兩個異或操作,eax和ebx我們要是知道就沒問題了,eax提示我們實在401000處,在原檔案可以找到

解密的資料從401000開始,一次解密4個位元組,在這之前又根據輸入的password計算了兩個值,分別放在eax和ebx,由於有原始資料和加密後的資料,因此可以得到正確的初始eax

我們看一下原始檔案401000處的位元組81EC5657B9080000

現在是172EE6B6057E0C0D,則eax[0]=0xb7aac296;eax[1]=0x5a5a7e05;eax[2]=0x99c51d27

ebx就只能爆破了

這裡有個牛逼的操作,用VS寫內聯彙編,和pwntools裡的asm有點像

#include <stdio.h>
#include<stdlib.h>

void get_eax(int *result) {
	int result_eax = 0, result_ebx = 0, input_eax = result[0], input_ebx = result[1];
	__asm {
		mov eax, input_eax
		mov cl, al
		mov ebx, input_ebx
		rol ebx, cl
		xor eax, ebx
		mov cl, bh
		ror eax, cl
		add ebx, eax
		mov result_eax, eax
		mov result_ebx, ebx
	};
	result[0] = result_eax;
	result[1] = result_ebx;
}

int main() {
	int first_eax = 0xb7aac296;
	int second_eax = 0x5a5a7e05;
	int third_eax = 0x99c51d27;
	int i = 0;
	int result[2] = { 0 };
	while (i <= 0xffffffff) {
		result[0] = first_eax;
		result[1] = i;
		get_eax(result);
		if (result[0] == second_eax) {
			get_eax(result);
			if (result[0] == third_eax) {
				printf("ebx:0x%p\n", i);
				break;
			}
		}
		i++;
	}
	system("pause");
	return 0;
}

結果如下

手動修改eax,和ebx就好了

參考連結:http://www.mottoin.com/article/reverse/88578.html

收穫是真的大,知道了內聯彙編以及一些檔案轉換的思路,而且這次不能F5,硬走了一波彙編的思路,受益匪淺

18.AutoHotkey2

這題提示是要修復檔案

這題也有UPX殼,脫殼拖進IDA,然後老樣子靠字串定位,還是有個自校驗函式,這次要恢復檔案,要好好的分析這個函數了

接下來校驗

很神奇,繞來繞去的,看了我半天

理清楚之後直接找那16個位元組地址偏移,如下

找到是0x00032800,改到倒數5-8位元組就好了

然後在OD裡看一下新的校驗值也改掉就好了

最後寫入的8個位元組是00 28 03 00 33 C6 2B 36

檔案開啟如下

這啥啊,這誰,原來還要做題的麼,貌似是權力的遊戲:jonsnow

19.Multiplicative

用jad直接看原始碼,如下

思路還是簡單的,百分百溢位了,寫指令碼逆向,只要爆破高位就行

指令碼都差不多,就直接拿別人的了,連結:https://blog.csdn.net/qq_33438733/article/details/82108961

i = 1

while(1):
    k = i*2**64  + 0xEAAEB43E477B8487
    if(k % 26729 == 0):
        print(k)
        print(k/26729)
        print(2**64-k/26729)
        break
    i += 1

20.Twist1

這題我真的是233了

提示如下

不管,直接OD,有殼,找OEP

然後繼續單步會找到處罰程式運作的地方再次下斷點

然後查詢字串定位

可以看到有一個關鍵的跳轉,懷疑401240就是check函式,打斷點F9,跑飛了,重來……

又跳到40720D

發現了一個關鍵的反除錯,而且貌似在WIN 10無效,不知道該怎麼弄,乖乖的跟著教程,把這個反除錯裡面的關鍵的值改掉

太坑了,直接看跳轉到哪裡好了,如下

裡面你有一大堆異或操作

把ebx(input)倒數最後一個位元組取出來和0x36異或

這個操作可以學習一波,判斷和0x36異或之後是最後一個位元組否等於0,如果是的話,證明最後一個位元組是0,則原先只有6位

然後繼續往下看,從如下所示還是對輸入進行異或操作

這種與0x77異或之後等於0x35(答案:B)的操作有一不少的,要一個個看過去

我剛開始發現湊不夠六位是因為一開始就漏了,很迷,

答案:RIBENA

參考連結:http://www.mottoin.com/article/reverse/88447.html

21.MetroApp

這題沒有環境,就靜態看了

提示如下

做到現在感覺自己馬上就要棄坑了,題目越來越難,有一些只能看到WP才能有思路了,有些甚至照著復現都已經是很難了

先把appx用ZIP打卡,可以看到一個exe

執行不了,直接拖進IDA

函式一大堆,直接搜字串,出了個string too long 我啥都沒找到……

給個連結吧:https://blog.csdn.net/whklhhhh/article/details/78291092