CTF--信息技術對抗賽ISCC之安卓逆向分析

0x01 題目介紹


    本題目是一道信息安全大賽上的安卓逆向題目,主要考察選手,逆向分析能力,

反彙編能力,安卓程序結構分析能力,以及常見的安全加密編碼算法得能力。題

目下載 http://download.csdn.net/detail/bjtbjt/9846682可能部分步驟過於囉嗦,大

佬略過。方便入門者學習。這個題目拿到手是個安卓apk程序。下載下來,我們先

不着急進行分析。先對其程序apk安裝測試一下,看看有什麼功能和提示,或者了

解一下要求我們做什麼。在這裏呢, 不建議大家直接在自己的安卓手機上安裝,

最好使用模擬器。我這裏呢,使用的是模擬器。模擬器地址網上也很多,我自己

安裝的是藍疊模擬器


http://www.bluestacks.cn/




安裝很簡單,就是下一步。如果出現這個說明安裝成功了。




然後把我們的程序添加到這個模擬器,本地安裝APK點擊選擇,安裝好即可。

我們測試一下題目,隨便輸入1234,發現驗證失敗。那麼此題目輸入正確答案

密碼串。






0x02 解題要點


    到了這裏,可以請出我們的安卓逆向神器,當然也有其它類似反編譯器。

apktool,jd等之類的工具。JEB我這裏是jeb 2.2.7破解版。載入我們的apk程

序進行分析。





通過關鍵按鈕菜單,我們進行手動分析。和反編譯部分函數和模塊。由於剛纔的

安卓程序有個按鈕和編輯框。因此必須找到這個關鍵點位置。如下:onClick事件

就是負責處理驗證密碼過程。





前面綠色的數字ID就是按鈕編輯框的標識,主要觀察這個驗證過程。對於用戶的輸入

這個程序先進行了。



此處把用戶輸入進行了字符串轉化,然後去除空格。進行了encode函數編碼。到底這是

個什麼算法,還得跟蹤Digest這個類對象的定義。先彆着急分析編碼函數,我們繼續看

下面的代碼關鍵點有個checkFlag函數進行了正確與否的驗證,因爲後面的輸出判斷剛好

有失敗和成功之分。




這個函數呢,有聲明,但是沒有具體定義實體。爲什麼呢,因爲這個是個內部JNI函數。

科普一下 Java Native Interface (JNI)標準是java平臺的一部分,它允許Java代碼和其他

語言寫的代碼進行交互。JNI 是本地編程接口,它使得在 Java 虛擬機 (VM) 內部運行的

Java 代碼能夠與用其它編程語言(如 C、C++ 和彙編語言)編寫的應用程序和庫進行交互

操作。


http://www.cnblogs.com/hoys/archive/2010/10/28/1863612.html

http://www.2cto.com/kf/201308/232666.html


到這裏基本上就算是驗證結束。那麼我們看到了其中經歷兩個驗證函數。一個是encode,

一個是checkFlag函數。只要分析清楚這兩個函數,那麼我們就直接可以進行反推,逆向

分析算法獲取結果。


先來看看第一個函數encode




看編碼和基本操作,好像是個base64,這個爲了高校簡單起見,我們可以直接驗證這段java代碼類。

自己編輯測試個字符串即可。




找個bas64算法驗證一下。




驗證成功。


下面我們關注第二個函數算法

既然是個內部函數,那麼我們看看它在哪,其實我們可以從內部導出這個庫文件,存儲爲*.so




然後單獨ida分析這個iscc.so庫。




關鍵函數checkFlag定位




關鍵靜態密文字符串




分析算法






這裏面將用戶輸入的字符串重新複製了一份,然後操作
先將用戶輸入的字符串按照長度分割成兩半
把前一半字符串中的字符按照從左到右的順序取出來
ASCII碼減去 5 , 然後與後半個字符串與之對應的位置進行交換。

最後是比較加密結果是否等於我們靜態存儲的密文。

=0HWYl1SE5UQWFfN?I+PEo.UcshU

完全一致返回真,否則返回假。

基於此算法,我們就可以手動編寫逆向算法了。


'''
@author: 5t4rk
'''
def decrypt(cipher_string):
    try:
        plain = list(cipher_string)
        plain.reverse()
        print ''.join(plain)
        for i in range(0, (len(plain) / 2)):
            plain[i] = chr(ord(plain[i]) + 5)
        return''.join(i for i in plain)
    except Exception , e:
        print e
        pass

if __name__ == '__main__':
    print decrypt("=0HWYl1SE5UQWFfN?I+PEo.UcshU").decode("base64")
    pass

output:
UhscU.oEP+I?NfFWQU5ES1lYWH0=
flag{ISCCJAVANDKYXX}

 


0x03 學習總結


    本次題目難度不是很大,主要是注意兩個算法的分析。

一個base64一個逆向置換編碼

必須找到關鍵checkFlag函數。


參考點:

http://www.2cto.com/kf/201308/232666.html

http://blog.csdn.net/lovoo/article/details/51429303

http://www.cnblogs.com/hoys/archive/2010/10/28/1863612.html

http://blog.csdn.net/jiangwei0910410003/article/details/49336613/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章