BugkuCTF 逆向工程 部分WP
1. Easy_vb
下載下來是一個exe
直接拖進OD看字串就好
2. Easy_Re
打開了隨便輸一下,直接拖進IDA
直接可以在hex裡找到flag
3. 遊戲過關
開啟之後是一個遊戲,我也是有點醉,說實話這個遊戲還蠻好玩的
拖進IDA,emmmm,看不懂,都沒找到main函式,拖進OD,搜字串,開始分析
在上圖設定斷點,發現只要在程式中輸入一個n,就會跳轉到這裡,是任何書數都會跳轉到這一段
可是我們的目的是跳轉到done!!!the flag is 這一段
我們試著把跳轉地址定位到done!!!the flag is 這一段來試試看,我們可以看見一大堆相同的跳轉語句,直接把第一個改了
因為我改的是第一個跳轉語句,我猜是輸入1時的跳轉,我就輸了1,bingo
4. Timer(阿里CTF)
一個apk檔案,安卓逆向麼
我用jeb開啟的,但是看不到反編譯的java程式碼,有沒有帶哥告訴我一下,我自己這題是用gui開啟的
根據題目的名字,懷疑和時間有關
看到這一步我想起一個大佬和我說的話,雖然你一點也不會java,但是有時候看懂也就夠了
beg和now引數的差小於等於0的時候,你就有flag了
基本就是時間引數的差值,我猜測就是過多少秒才能執行,now應該就是現在的時間,我們底下也看到了
t獲取了當前的毫秒數,處以1000,那就是秒,然後beg就是當前時間加上200000秒
意思就是程式運行了200000秒以後,才能開始算flag,那我們把時間引數改掉後跑一邊程式碼就好了,但我沒裝java環境,我們在之前的圖可以看到最後的flag就是由k生成的,我們把k最後的結果逆向出來就好了
就上個指令碼吧,把k求出來
def is2(paramInt): if paramInt>3: if ((paramInt % 2 != 0) and (paramInt % 3 != 0)): i = 5 while(True): if (i * i <= paramInt): if (paramInt % i != 0) and (paramInt % (i + 2) != 0): i += 6 continue return False else: return True return False elif paramInt<=1: return False return True time=200000 k=0 key=True while(time>0): if is2(time): k+=100 else: k-=1 time-=1 #print(k) k=1616384
然後接下來因為沒下過java編寫的軟體,stringFromJNI2這個操作我也不太懂,算出k的引數以後就暫時先放一下
5. 逆向入門
開啟之後密密麻麻都是字,開頭有提示base64,直接base64轉圖片
6. love
是個exe,拖進IDA分析main函式
前面一頓操作,最後有個比較函式,與str2字串作比較,對的話就成功了
str2是常量,輕鬆找到,然後要逆回去,我們看一下操作是什麼
上面的這段是之前的一個操作,分析下來是一系列的以為操作
再結合這一段,可以分析出就是不斷的三個一組進行擴充套件,整個長度增加了三分之一,結合看了aAbcdefghijklmn的資料,可知是base64解密,且置換方式沒變
把上面這段逆回去之後,直接解密就好了
import base64
m='[email protected]@dH'
flag=''
for i in range(len(m)):
flag+=chr(ord(m[i])-i)
flag=base64.b64decode(flag)
#print(flag) b'{i_l0ve_you}'
7. LoopAndLoop(阿里CTF)
jeb反編譯成java,看主函式
最後關鍵就是check函式判斷,要是相等就繼續往flag的段落執行,然後stringFromJNI2函式進行變形
這兩個函式都在native層,我剛開始也不知道native層怎麼看,後來大佬告訴我,把檔案裡的liblhm.so檔案拖出來分析就好了,裡面有(彷彿知道那個Timer怎麼做下去了),這個檔案和classes.dex同級別的lib資料夾裡
把該檔案拖進IDA
發現常用方法找不到主函式,又是大佬教我的,通過搜尋字串來找
進去之後可以看見主要函式
我們知道是chec函式(看函式標題),可以看到具體流程就是,最後一個引數*2%3的值來選擇執行哪個check(1、2、3)函式
因為仍和一個check函式裡面有chec函式,所以會不斷迭代,迭代的範圍次數是[2,]
上指令碼
def check1(input,loop):
a=input
for i in range(1,100):
a=a-i
return a
def check2(input,loop):
a=input
if loop%2==0:
for i in range(1,1000):
a=a-i
else:
for i in range(1,1000):
a=a+i
return a
def check3(input,loop):
a=input
for i in range(1,10000):
a=a-i
return a
key=1835996258
target = key
for i in range(2,100):
if 2 * i % 3 == 0:
target = check1(target,i - 1)
elif 2 * i % 3 == 1:
target = check2(target,i - 1)
else:
target = check3(target,i - 1)
print(target)
#236492408
程式裡輸入這串就好了
8. 入門逆向
下載下來是一個閃退的exe
用OD開啟,靠字串定位
找到位子之後,一大堆mov賦值操作,堅定我用IDA開啟的信念
額,果然是入門…………這裡有個小技巧,一個個輸太傻了,可以在在OD裡面直接在資料窗口裡搜
這裡有個小錯誤,o要大寫,後來才發現的
9. Take the maze
開啟如下
OD加IDA,emmmm,要有耐心對不對,OD開啟亂的不行,IDA走一波,看一下main函式
可以看見輸入的長度應該24個字元,看看還有沒有別的,看見有個flag.png字串,估計是有圖片,定位過去看一波
動態執行一下,把程式指引到這一段上,看看會生成什麼檔案,至於怎麼跳過去,就試試好了,總會成功的,先跳到下面這段,一步步來,改三個跳轉語句就到了
繼續單步執行
會發現生成了一個png檔案,是一個二維碼
掃描完之後,如下
自閉,繼續分析………………
乖乖會主函式分析,但是函式其實挺複雜的,怎麼找check函式呢
我們看到這個函式明顯就是check的部分,重點分析
這一段其實也蠻明顯的,如下,可以知道我們要輸的是什麼,比較硬核的人可以直接爆破233
好了,分析一波check函式
細心的你可能發現了,兩個字元一組來決定什麼操作,這個個字元是一段字串(這裡就叫它字典吧)的索引
然後看一下知道索引後是什麼操作
字典如下
同時這個switch總感覺讓人有一種在做迷宮題的感覺,這裡的dlru應該對應的就是前後左右之類的,目前只是猜測
研究一下這四個函式,先看第一個好了,如下
a2顯然控制了迴圈次數,那麼也就是說我們其中的一個索引值是控制了迴圈次數
而最後一定是要將i的值寫入*a1才有意義,那麼就可以判斷出限制條件了:
i/26<=10;
dword_540548[i] ^ dword_540068[i] ==0;
那麼結合我們迷宮的猜測,顯然前者限定了範圍,後者限定了路徑,雖然怎麼限定路徑的我目前還是沒看出來,反正就是異或等於0則操作成功
不過這一題比較友好的就是上下左右特別好判斷,u,d,l,r對應上下左右嘛
接下來就要找地圖,起點,終點了
i每次加26,可以推斷出,每行有26個字元,分析一下走的範圍的話,只能在四個函式裡自己蒐集了
1<=x<=25
1<=x<=24
0<=y<=10
1<=y<=25
何在一起 x∈[1,24];y∈[1,10]
看一下check函式怎樣才會結束,在main函式的開頭有這麼一段,如下
長寬猜也猜出來了:12*26
這題最坑的就是迷宮圖的構造了
在四個函式裡,我們可以看到每個方向什麼時候可以走,所以我們要把四條合法路徑全部求出來,對於不會IDC的我來說是很不友好的,我是慢慢用python調的,太心酸了,好想會IDC啊……
當然在蒐集資料的時候也不太順利,感覺IDA有時候也有毒,要自己推一下
得出走法:06360836063b0839073e0639
最後是可以得到結果的,但是輸入程式發現還是錯的,23333
看一下最開始輸入字元前對字元是否進行過處理,如下
這個45C748函式對我們的輸入應該是做了處理的,進去看一下,會發現一大堆switch語句,這要逆到什麼時候去啊,果斷放棄,動態除錯一下
因為OD裡面畢竟和IDA不同調試起來還是比較累的,要慢慢找到你需要的函式的主體部分,畢竟base地址不同,對照彙編或者是低地址找一下好了,我們的函式如下
以此類推到最後的switch部分
我們輸入123456781234567812345678測試,輸出為1317131?9;9?9;97 #!'!#!/,長度不變
我們自己測試一波,如下
emmmm,是不是發現了什麼,那麼規律我們就找到了,test一下
把結果加上我們掃描的二維碼字尾合起來輸入,emmmmm,還是錯了,即將自閉
再回過去看一下,發現對輸入的變換還有個小操作,如下
v6其實是你輸入的第17個字元,一開始就要和1異或,真的是太刺激了
最後試一遍,終於成功了,答案為:zsctf{07154=518?9i<5=6!&!v$#%.Docupa}