天天看點

BugkuCTF-Reverse題Timer(阿裡CTF)

知識點

JEB相當于Windows平台上的IDA

smali代碼:輕按兩下Bytecode,出現smali代碼;相較于C之彙編,那麼smali之于Java

onCreate:

一個activity啟動回調的第一個函數就是onCreate,這個函數主要做這個activity啟動的一些需要的初始操作的工作。

onCreate之後調用了還有onRestart()和onStart()等。

解題流程

下載下傳apk包

apk安裝之後出現一個讀秒的,20萬秒,大于3600,是以大于一個小時,是以太慢了,不等了。

BugkuCTF-Reverse題Timer(阿裡CTF)

jeb反編譯,主要JEB反編譯得到的java代碼看起來比較清晰

MainActivity代碼:

BugkuCTF-Reverse題Timer(阿裡CTF)
BugkuCTF-Reverse題Timer(阿裡CTF)
BugkuCTF-Reverse題Timer(阿裡CTF)
BugkuCTF-Reverse題Timer(阿裡CTF)

源碼審計

MainActivity

BugkuCTF-Reverse題Timer(阿裡CTF)

對程式進行分析

初始操作了一些變量,其beg為(((int)(System.currentTimeMillis()/1000)+200000;

this.beg = (((int)(System.currentTimeMillis() / 1000))) + 200000;beg為一個定值,在上面代碼的run()函數裡,k是可以變化的

MainActivity.this.t = System.currentTimeMillis();

MainActivity.this.now = ((int)(MainActivity.this.t / 1000));

給出了now的指派,從程式的運作來看,beg在now初始指派後應該比now大了200000,now代表的是程式運作的時間,當now變化了200000的時候,也就是說beg小于now的時候,會進入設定flag的地方。

也就是說,程式一開始k是變化的,flag的值并沒被設定,隻有當beg==now的時候,flag會被設定并顯示,然後到下面k可能還會變化,那麼這個被設定的初始flag可能就是我們要拿到的flag了。

也即目前的系統時間除以1000,再加上200000。繼續看onCreate:

最先留意的是

this.val$tv2.setText(“alictf{” + MainActivity.this.stringFromJNI2(MainActivity.this.k) + “}”);

可以看出,flag與k有關,而這裡有個stringFromJNI2,其是一個底層的函數

繼續閱讀的話,你可以看到對k做了操作。

這裡k,應該為由beg和now反複運算得到。不過,beg-now應為200000,是以,我們可以複制出代碼運算得到k的值,然後,修改代碼重新編譯

總結思路:通過beg - now代入is2函數對k進行操作,200000,需要一秒一秒的操作,而我們,直接通過寫代碼模拟出200000的結果,找到k,然後改動k值,直接調用,就可以得到flag了。

提取關鍵代碼計算出k的值

直接根據k的變化部分的函數進行模拟,算出進行了200000s之後的k值:

參考java-算k值.java:

Python腳本:

def is2(n):
    if(n <= 3):
        if(n > 1):
            return True
        return False
    elif(n % 2 == 0 or n % 3 == 0):
        return False
    else:
        i = 5
        while(i * i <= n):
            if (n % i == 0 or n % (i + 2) == 0):
                return False
            i += 6
    return True

k=0

for i in  range(200000,0,-1):
    k = k + 100 if is2(i) else k - 1
print(k)
           

輸出k的值為1616384,下面我們需要把k值修改為這個值,然後進入進行flag設定的if語句就可拿到flag了,下面進行操作。

通過Android killer反編譯

将輸出flag的條件反過來,即MainActivity$1.smali裡的if-gtz v0, :cond_0這句話(後面是輸出The Flag Is那裡的跳轉)改為if-ltz v0, :cond_0

将k值改為常量,即上文提到的smali檔案裡的iget v3, v3 …(省略);->k:I之後添加const v3, 1616384

BugkuCTF-Reverse題Timer(阿裡CTF)

就是大于改為小于,gt為大于,lt為小于,請求時間與系統時間的內插補點小于0才會顯示flag

BugkuCTF-Reverse題Timer(阿裡CTF)

插入這句話,原因是k儲存在v3寄存器内,是以修改v3就能修改k

(這裡的v0,v1,v2,v3等都是寄存器,添加的指令就是寄存器的指派)

把if的判斷條件進行修改

if-gtz v0, :cond_0 的意思是,如果v0>0,就跳轉到:cond_0,是以把gtz改為ltz。

在alictf裡面的k值後面再對k進行設定。

儲存,重新編譯下。

修改後生成的apk路徑:

file:F:\CTF\CTF_Tool\Reverse\Android\AndroidKiller\AndroidKiller_v1.3.1\projects\file\Bin\file_killer.apk

然後在模拟器裡運作就可以拿到flag了。

BugkuCTF-Reverse題Timer(阿裡CTF)

注意

編譯譯打包程式

在編譯的時候遇到以下問題

Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name ‘@android:style/WindowTitleBackground’.

Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name ‘@android:style/WindowTitleBackground’.

解決方法

解決方法

找到res/value-v23/styles.xml,把resources下的東西注釋掉

找到res/value/public.xml,把所有帶Base.V23的東西(兩個)注釋掉

繼續閱讀