ps:題目是別人發給我的,本人太菜沒資格參加這個比賽
vulcrack
首先jadx打開,發現是一個殼程序
libjiabu.so和包名這些很容易看出是一個360殼,這裏採用最近各大論壇比較流行的frida-dexDump進行脫殼
講道理這題挺噁心人的,我用安卓模擬器打開的時候無法運行,感覺可能是該360殼存在模擬器檢測,那麼沒辦法只有使用真機進行操作,然鵝我的真機的比較辣雞,啓動frida經常報錯,其中甚至考慮過手動脫殼,最後折騰半天終於完成脫殼。
脫殼過程
啓動frida_server:
cd /data/local/tmp
./frida_server
端口轉發:
adb forward tcp:27042 tcp:27042
然後運行apk,運行main.py
python main.py
分析dex
拿到dex之後,查看發現主要加密地址
脫殼完成後的邏輯就非常簡單了
(1)將keyFirst和keySecond進行base64解碼,
(2)傳入到comm方法中進行一些處理
python腳本解密:
import base64
keyFirst = "Zm1jan85NztBN0c0NjJIOzJGLzc8STk0OTZFSDE="
keySecond = "QTpISTlFNEkxRTY8fQ=="
flag = []
First=base64.b64decode(keyFirst)
Second=base64.b64decode(keySecond)
for i in range(len(First)):
flag.append(First[i] - (i % 8))
for i in range(len(Second)):
flag.append(Second[i] - (i % 4))
print(bytes(flag))
解密得出flag爲:
flag{414A6E12-B42E-48D3-95CE-A9FF9D2F1D49}
總結
本題的難點主要在脫殼上,使用工具脫殼極大簡化了這一步,以後研究一些脫殼過程寫一份手動脫殼方案。
java
首先打開jadx分析,題如其名,所有的代碼都在java層
分析
主要的加密邏輯存放在a方法中:
(1)首先初始化數組bArr
(2)將字符串a,b進行AES加密操作
(3)調用a方法,先將aes加密後的字符串和按位異或22後,在和c類中的c數組按位異或操作
(4)將異或完成後的字符串進行base64編碼後和字符串b進行比較
這裏有一個小坑,就是程序代碼中有一個地方將字符串c.a中的一個字符進行了替換
我起初寫腳本時始終報錯
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 3: invalid continuation byte
,最後通過動態調試查看具體邏輯才發現了這個替換的地方
python腳本
import base64
from Crypto.Cipher import AES
b = "VsBDJCvuhD65/+sL+Hlf587nWuIa2MPcqZaq7GMVWI0Vx8l9R42PXWbhCRftoFB3"
c = [214, 144, 233, 254, 204, 225, 61, 183, 22, 182, 43, 103, 20, 194, 40, 251, 44, 5, 43, 103, 154, 118, 42, 190, 4,195, 43, 103, 170, 68, 19, 38, 73, 134, 43, 103, 153, 156, 66, 80, 244, 145, 80, 103, 239, 152, 122, 98, 50, 214]
x = base64.b64decode(b)
y = []
for i in range(len(x)):
y.append(x[i] ^ 22 ^ c[i])
y = bytes(y)
aeskey = "aes_check_key!@#".replace('e','o').encode("utf-8")
cipher = AES.new(aeskey, AES.MODE_ECB)
z = cipher.decrypt(y)
flag=str(z,encoding="utf-8")
print(flag)
輸出結果爲:
flag{67587AAF-C20A-4B6D-991B-A40FD3C2098E},測試結果通過。
總結
這個題目還是比較簡單了,我也是後來纔得到這個題目,此題都是java邏輯,唯一坑人的地方就是那個替換,我是藉助動態調試的方式解決的
歡迎個人關注公衆號瞭解更多資料: