1. 程式人生 > >2016 alictf Timer writeup

2016 alictf Timer writeup

時間 img kill 當前時間 jadx time jad mage android

Timer-smali逆向

參考文檔:http://blog.csdn.net/qq_29343201/article/details/51649962

題目鏈接: https://pan.baidu.com/s/1jINx7Fo (在裏面找相應的名字就行)

題目描述:每秒觸發一次計算,共有200000秒,答案參與計算,不可能等待下去。

使用工具:Android Killer,jadx-gui

解題方法有多種,我參照網上的一種方法。通過對native層,代碼的還原,計算出200000秒後的關鍵變量k,傳入主調用,得到答案

解題過程:

System.currentTimeMillis()相當於是毫秒為單位,獲取當前時間

技術分享

先是把單位變成秒,然後加上200000秒

第二塊邏輯,用於篩選秒數的自定義函數,可以忽略,之後按代碼邏輯就行

技術分享

第三塊邏輯,主程序段,包含最後打印flag值的代碼段

技術分享

分成三段來看:

第一段:super繼承,調用頁面設計框架,實例化handler函數

第二段:t的作用在於將時間一點一點減少,beg的值在前面,代表一開始時間,now代表現在的時間

第三段:當差值為0或小於打印flag,否則調用is2函數判斷,true,k+100,false,k-1

所以有了下面的解密程序

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; def main(): time = 200000 k = 0
while time > 0: if is2(time): k += 100 else: k -= 1 time -= 1 print(k) if __name__ == __main__: main()

將得到的k值傳給native代碼,此時的k是經過200000運算的k,傳進去直接返回結果

在傳入native的時候要註意,首先要確定run函數的位置,這一塊方法結束了,沒找到邏輯,

技術分享

通過字符串搜索找到run函數的位置,在MainActivity$1.smali中

技術分享

直接將k傳入不用運行200000次,需要更改"The flag is:"之前的關鍵跳轉

if-gtz v0, :cond_0 改為 if-ltz v0, :cond_0

根據分析,k的值是v3的值,所以要在獲取v3之後,修改v3的值

技術分享

重打包,得到flag

技術分享

嘿嘿,又做出來一道。

2016 alictf Timer writeup