一、題目來源
來源:XCTF社區安卓題目easy_apk
二、破解思路
1、首先運行一下給的apk,發現就一個輸入框和一個按鈕,隨便點擊一下,發現彈出Toast驗證失敗
。如下圖所示:
2、將該APK直接拖進AndroidKiller中反編譯,搜索關鍵字驗證失敗,如下圖所示:
3、關鍵代碼就在MainCtivity.java處,使用jeb直接查看Java代碼(偷懶不看smali匯編了,看到腦殼痛),發現代碼邏輯為將用戶輸入的字符串使用Base64New類中的Base64Encode()函數加密后和一個字符串相比較,若相等,則驗證通過,否則驗證失敗,點擊跳轉到Base64New類中,發現Base64Encode()函數首先將用戶輸入得到的字符串轉為字節數組作為參數,然后每3個字節為一組,擴展為4個字節,最后查表即可(感覺很眼熟的樣子,emmmm就是base64編碼,只是對照表跟base64對照表不同,可惜我在寫完解密腳本之后才發現是這東西),那么解密過程也很簡單了,直接對字符串4個字節一組分組,縮減為3個字節一組(語文水平感覺很差的樣子寫道這里。。。。),然后轉為字符拼接成字符串即可。
4、將解碼過程寫出python腳本跑出flag,填入驗證通過!!!
三、總結
總結:很基礎的一道題,唯一的難點就在必須寫base64解碼腳本了吧,emmmm要是像我一樣木有認出來是base64,那一開始就有點難受了!!!下面附上Base64編碼解碼原理以及相關腳本!!!
Base64編碼原理:
1、將字符串轉為字節數組,然后每3個字節一組,一個24個比特,不足3個字節直接補0
2、在每一組3個字節24bit中,以6個bit構成一個字節(高兩位補0),形成4個字節為一組
3、根據編碼后的字節查找對照表,拼接成字符串,自此,Base64編碼完成!!!
Base64解碼原理:
1、將編碼后的字符串查找對照表后的字節以4個字節為一組,出現=
直接去掉即可
2、將這4個字節每個字節的高兩位去掉,有32bit變為24bit,將這24bit以8個bit構成三個字節
3、將第二步得到的字節數組轉為字符串即可!!!
附上python腳本(ps:由於markdown問題,所以有需要的主機更改一下某些地方的縮進):
def Base64Decode(str_list):
list_base = []
a = str_list[0] << 2
c = str_list[1] & 15
b = str_list[1] >> 4
a = a | b
list_base.append(a)
c = c << 4
a = str_list[2] & 3
b = str_list[2] >> 2
c = c | b
list_base.append(c)
a = a << 6
a = a | str_list[3]
list_base.append(a)
return list_base
CodingTable = 'vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/'
Ciphertext = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
i = 0
flag = 'flag{'
while i <= (len(Ciphertext) - 1):
list1 = []
n = 0
for k in range(4):
if Ciphertext[i + k] == '=':
list1.append(0)
n = n + 1
else:
list1.append(CodingTable.index(Ciphertext[i + k]))
ba = Base64Decode(list1)
for j in range(3 - n):
ch = chr(ba[j])
flag = flag + str(ch)
i = i + 4
flag = flag + '}'
print(flag)