2016 alictf Timer writeup
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 = 0while 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