攻防世界app2 frida获取密钥

环境准备

安装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路径在:MuMuemulator emuvmonitorin

 当前无连接设备

连接设备

 将之前下载的文件传到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()

运行结果

 找到了输入的值,密钥,和输出的值

原文地址:https://www.cnblogs.com/hongren/p/13489152.html