2020网鼎杯玄武组移动安全wp
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 = "aaa@qq.com#".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逻辑,唯一坑人的地方就是那个替换,我是借助动态调试的方式解决的
欢迎个人关注公众号了解更多资料: