0x01 題目介紹
本題目是一道信息安全大賽上的安卓逆向題目,主要考察選手,逆向分析能力,
反彙編能力,安卓程序結構分析能力,以及常見的安全加密編碼算法得能力。題
目下載 http://download.csdn.net/detail/bjtbjt/9846682可能部分步驟過於囉嗦,大
佬略過。方便入門者學習。這個題目拿到手是個安卓apk程序。下載下來,我們先
不着急進行分析。先對其程序apk安裝測試一下,看看有什麼功能和提示,或者了
解一下要求我們做什麼。在這裏呢, 不建議大家直接在自己的安卓手機上安裝,
最好使用模擬器。我這裏呢,使用的是模擬器。模擬器地址網上也很多,我自己
安裝的是藍疊模擬器
安裝很簡單,就是下一步。如果出現這個說明安裝成功了。
然後把我們的程序添加到這個模擬器,本地安裝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/