reversing.kr 開坑(目前完成19題)暫時斷更,自閉ing……
肝就完事了……
拖進IDA
四段拼起來就好。注意順序
讓我們找OEP,OD啟動
直接OEP定律就好
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了
應該是隻要bypass就可以看見flag了
用peid的時候發現這個是vb,直接瑞彈窗框在OD中下斷點
第一次卡死,暫停看堆疊,發現box在4045D8,向上翻有個跳轉語句,直接改成jmp如下
然後執行到最後,又有個彈窗
老樣子,一樣的操作就好
然後在MP3 Player的地方會出現password
7.CSHOP
開啟後就是如圖所示,很詭異,不知道要幹嘛,PEID一波,發現是C#
直接dnspy反編譯看看咋回事
這咋看,看不懂啊……在裡面慢慢找吧
最後在資源裡面看到了一個button,eng?還有按鈕,仔細一看,大小被調成0了,還有tabindex=0,按空格鍵相當於點選按鈕
點選一下空格出現答案
因為是flash,很好奇,就來看看,結果發現有現成的工具ffdec,反混淆之後直接按照提示輸入數字就好…………
數字:1456,25,44,8,88,20546
一道蘋果的,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好用,真香
顧名思義,我應該是腦子被搶打了,才來看核心的題目,主要是好奇,從來沒接觸過
萬幸還算是有提示:
請對小寫進行身份驗證,不知道啥意思,但是可以知道有身份驗證
一開始是驗證不通過的
在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
用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