1. 程式人生 > >BugkuCTF 逆向工程 部分WP

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}