BugkuCTF-Reverse题Timer(阿里CTF)
知識(shí)點(diǎn)
JEB相當(dāng)于Windows平臺(tái)上的IDA
smali代碼:雙擊Bytecode,出現(xiàn)smali代碼;相較于C之匯編,那么smali之于Java
onCreate:
一個(gè)activity啟動(dòng)回調(diào)的第一個(gè)函數(shù)就是onCreate,這個(gè)函數(shù)主要做這個(gè)activity啟動(dòng)的一些需要的初始操作的工作。
onCreate之后調(diào)用了還有onRestart()和onStart()等。
解題流程
下載apk包
apk安裝之后出現(xiàn)一個(gè)讀秒的,20萬(wàn)秒,大于3600,所以大于一個(gè)小時(shí),所以太慢了,不等了。
jeb反編譯,主要JEB反編譯得到的java代碼看起來(lái)比較清晰
MainActivity代碼:
源碼審計(jì)
MainActivity
對(duì)程序進(jìn)行分析
初始操作了一些變量,其beg為(((int)(System.currentTimeMillis()/1000)+200000;
this.beg = (((int)(System.currentTimeMillis() / 1000))) + 200000;beg為一個(gè)定值,在上面代碼的run()函數(shù)里,k是可以變化的
MainActivity.this.t = System.currentTimeMillis();
MainActivity.this.now = ((int)(MainActivity.this.t / 1000));
給出了now的賦值,從程序的運(yùn)行來(lái)看,beg在now初始賦值后應(yīng)該比now大了200000,now代表的是程序運(yùn)行的時(shí)間,當(dāng)now變化了200000的時(shí)候,也就是說(shuō)beg小于now的時(shí)候,會(huì)進(jìn)入設(shè)置flag的地方。
也就是說(shuō),程序一開(kāi)始k是變化的,flag的值并沒(méi)被設(shè)置,只有當(dāng)beg==now的時(shí)候,flag會(huì)被設(shè)置并顯示,然后到下面k可能還會(huì)變化,那么這個(gè)被設(shè)定的初始flag可能就是我們要拿到的flag了。
也即當(dāng)前的系統(tǒng)時(shí)間除以1000,再加上200000。繼續(xù)看onCreate:
最先留意的是
this.val$tv2.setText(“alictf{” + MainActivity.this.stringFromJNI2(MainActivity.this.k) + “}”);
可以看出,flag與k有關(guān),而這里有個(gè)stringFromJNI2,其是一個(gè)底層的函數(shù)
繼續(xù)閱讀的話,你可以看到對(duì)k做了操作。
這里k,應(yīng)該為由beg和now反復(fù)運(yùn)算得到。不過(guò),beg-now應(yīng)為200000,所以,我們可以復(fù)制出代碼運(yùn)算得到k的值,然后,修改代碼重新編譯
總結(jié)思路:通過(guò)beg - now代入is2函數(shù)對(duì)k進(jìn)行操作,200000,需要一秒一秒的操作,而我們,直接通過(guò)寫(xiě)代碼模擬出200000的結(jié)果,找到k,然后改動(dòng)k值,直接調(diào)用,就可以得到flag了。
提取關(guān)鍵代碼計(jì)算出k的值
直接根據(jù)k的變化部分的函數(shù)進(jìn)行模擬,算出進(jìn)行了200000s之后的k值:
參考java-算k值.java:
Python腳本:
輸出k的值為1616384,下面我們需要把k值修改為這個(gè)值,然后進(jìn)入進(jìn)行flag設(shè)定的if語(yǔ)句就可拿到flag了,下面進(jìn)行操作。
通過(guò)Android killer反編譯
將輸出flag的條件反過(guò)來(lái),即MainActivity$1.smali里的if-gtz v0, :cond_0這句話(后面是輸出The Flag Is那里的跳轉(zhuǎn))改為if-ltz v0, :cond_0
將k值改為常量,即上文提到的smali文件里的iget v3, v3 …(省略);->k:I之后添加const v3, 1616384
就是大于改為小于,gt為大于,lt為小于,請(qǐng)求時(shí)間與系統(tǒng)時(shí)間的差值小于0才會(huì)顯示flag
插入這句話,原因是k保存在v3寄存器內(nèi),因此修改v3就能修改k
(這里的v0,v1,v2,v3等都是寄存器,添加的指令就是寄存器的賦值)
把if的判斷條件進(jìn)行修改
if-gtz v0, :cond_0 的意思是,如果v0>0,就跳轉(zhuǎn)到:cond_0,所以把gtz改為ltz。
在alictf里面的k值后面再對(duì)k進(jìn)行設(shè)定。
保存,重新編譯下。
修改后生成的apk路徑:
file:F:\CTF\CTF_Tool\Reverse\Android\AndroidKiller\AndroidKiller_v1.3.1\projects\file\Bin\file_killer.apk
然后在模擬器里運(yùn)行就可以拿到flag了。
注意
編譯譯打包程序
在編譯的時(shí)候遇到以下問(wèn)題
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的東西(兩個(gè))注釋掉
總結(jié)
以上是生活随笔為你收集整理的BugkuCTF-Reverse题Timer(阿里CTF)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: BugkuCTF-WEB题file_ge
- 下一篇: 全网最细之N种内部类详细讲解