环境准备
安装mumu模拟器
pip安装frida,这里到最后一步setup需要很长时间。
在frida github下载对应服务端。
apk下载:https://adworld.xctf.org.cn/media/task/attachments/2554cf208cfb4cdf9218a840fa9bf237.apk
分析代码
使用jadx打开app,并来到MainActivity。
在click事件的处理当中,startActivity一个新的SecondActivity,进入它的onCreate
这里使用了Encryto.doRawData对数据进行处理,对这个函数进行查看,发现是从so文件中导入的函数。使用ida分析这个so文件。
打开后来到doRawData这个函数的位置,发现是使用了AES_128_ECB_PKCS5Padding_Encrypt进行加密。这里需要一个16位的密钥。使用frida,hook住该函数,取出对应的值就可以了
获取密钥
使用adb连接mumu。adb路径在:\MuMu\emulator\nemu\vmonitor\bin
当前无连接设备
连接设备
将之前下载的文件传到mumu里,并修改权限位777 。这里需要传入32位的文件。
直接运行,无报错即可
编写python脚本
import sys import threading import frida PACKAGE = 'com.tencent.testvuln' def get_device(): mgr = frida.get_device_manager() changed = threading.Event() def on_changed(): changed.set() mgr.on('changed', on_changed) device = None while device is None: devices = [dev for dev in mgr.enumerate_devices() if dev.type == 'usb'] if len(devices) == 0: print('Waiting for usb device...') changed.wait() else: device = devices[0] mgr.off('changed', on_changed) return device if __name__ == '__main__': jscode = """ Java.perform(function () { var nativePointer = Module.findExportByName("libJNIEncrypt.so", "AES_128_ECB_PKCS5Padding_Encrypt"); send("native: " + nativePointer); Interceptor.attach(nativePointer, { onEnter: function(args){ send(args); console.log("args[0]",Memory.readByteArray(args[0],20)) console.log("args[1]",Memory.readByteArray(args[1],20)) }, onLeave: function(retval){ send(retval); console.log("output",Memory.readByteArray(retval,30)) } }); }); """ def message(message, data): if message["type"] == 'send': print("[*] {0}".format(message['payload'])) else: print(message) device = get_device() print(device) process = device.attach(PACKAGE) print(process) script = process.create_script(jscode) script.on("message", message) script.load() sys.stdin.read()
运行结果
找到了输入的值,密钥,和输出的值