zoukankan      html  css  js  c++  java
  • 攻防世界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()

    运行结果

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

  • 相关阅读:
    半主机模式和_MICROLIB 库
    工作中常用的git命令
    Mybatis延迟加载参数配置
    JUnit展示图形化测试结果
    可读、可维护、可扩展,原则、模式与重构
    乐观锁和悲观锁
    HashMap实现原理和底层数据结构?
    视图有啥用?
    单例模式常见有哪几种?
    RPC服务和HTTP服务的区别
  • 原文地址:https://www.cnblogs.com/hongren/p/13489152.html
Copyright © 2011-2022 走看看