从bytectf中的一道题开始分析futter框架软件
字数 1400 2025-08-23 18:31:08

Flutter框架应用逆向分析实战指南

一、Flutter框架概述

Flutter是Google开源的应用开发框架,具有以下核心特性:

  • 跨平台编译:一套代码库可编译为ARM/Intel机器码及JavaScript
  • 原生性能:直接编译为原生平台代码,性能接近原生应用
  • 多设备支持:支持移动端、网页、桌面和嵌入式设备
  • 架构特点:在安卓中几乎完全抛弃Java层,主要逻辑实现在native层

识别特征:

  • APK中包含libapp.solibflutter.so
  • 主入口函数继承自Flutter父类,不直接创建页面

二、逆向分析工具链

1. reFlutter工具

安装

pip install reflutter

使用流程

  1. 执行重打包命令:
reflutter test.apk
  1. 选择功能:

    • 选项1:流量监控和拦截
    • 选项2:获取函数偏移地址(逆向分析选择此项)
  2. 签名重打包后的APK:

java -jar uber-apk-signer-1.2.1.jar --allowResign -a release.RE.apk

输出结果

  • 在应用私有目录(/data/data/包名)生成dump.dump文件
  • 需要root权限访问

2. Blutter工具

安装准备

  • Windows环境需要Visual Studio组件
  • 从GitHub克隆源码

安装命令

python scripts\init_env_win.py

使用流程

  1. 启动VS的"x64 Native Tools Command Prompt"
  2. 执行分析命令:
python blutter.py path/to/app/lib/arm64-v8a out_dir

输出文件

  • 恢复的符号表文件
  • IDA脚本文件

IDA整合

  • 打开libapp.so
  • File → Script file → 导入生成的py脚本
  • 恢复符号表

三、实战分析技巧

1. 关键函数定位

  1. 搜索main函数

    • 在IDA函数窗口中搜索"main"
    • 识别包含业务逻辑的函数(如babyapk$main__MyHomePageState::test_264c0c
  2. Frida动态分析

function startsWith_hook(){
    var libapp = Process.findModuleByName("libapp.so")
    if(libapp){
        console.log("find so:", libapp.base)
        Interceptor.attach(libapp.base.add(0x198D18), {
            onEnter: function(args){
                console.log(hexdump(ptr(this.context.x0)))
                console.log(hexdump(ptr(this.context.x1)))
                console.log(hexdump(ptr(this.context.x2)))
            },
            onLeave: function(retval){}
        })
    }
}

2. 动态调试技巧

  1. SO库断点设置

    • 对关键so(librust_lib_babyapk.so)的所有导出函数下断点
    • 跟踪frb_pde_ffi_dispatcher_sync等关键函数
  2. Flag格式分析

    • 通过动调识别格式特征(如包含"-"分隔符)
    • 提取有效部分进行验证(去除分隔符后的连续字符串)

3. 算法逆向与求解

Z3求解器应用

from z3 import *

data = [0x1EE59, 0x22A, 0x1415, 0x40714, ...]

def decrypt(i):
    s = Solver()
    v46, v47, v45, v44, v48, v49, v50, v51 = BitVecs("v46 v47 v45 v44 v48 v49 v50 v51", 8)
    
    # 添加约束条件
    s.add(And(48 <= v46, v46 <= 127))
    # ...其他变量范围约束
    
    # 添加方程约束
    s.add((v51 + v47 * v44 * v49 - (v46 + v50 + v45 * v48)) & 0xffffffff == data[i*8])
    # ...其他方程
    
    if s.check() == sat:
        print(s.model()[v46], end=",")
        # ...输出其他变量
    else:
        print("无解")

求解步骤

  1. 定义变量和值域(通常ASCII可打印字符)
  2. 添加从逆向分析得到的方程约束
  3. 使用求解器获取满足条件的字符值
  4. 组合得到完整Flag

四、典型问题解决方案

  1. Flutter应用无Java层逻辑

    • 重点分析libapp.solibflutter.so
    • 使用Blutter/reFlutter恢复符号
  2. 关键逻辑在第三方SO中

    • 对导出函数全面下断
    • 跟踪FFI调用接口
  3. 复杂验证算法

    • 使用符号执行工具(如Z3)
    • 将验证逻辑转化为约束方程
  4. 动态生成代码

    • 结合Frida进行运行时Hook
    • Dump内存中的关键数据

五、完整分析流程总结

  1. 识别框架:检查APK中的SO文件
  2. 符号恢复:使用Blutter/reFlutter
  3. 静态分析:IDA分析关键函数
  4. 动态验证:Frida Hook/Fuzz
  5. 算法逆向:动调跟踪验证逻辑
  6. 约束求解:Z3等工具自动化求解
  7. 结果验证:构造完整Flag提交测试

通过这套方法论,可有效分析大多数Flutter框架开发的应用程序,特别适用于CTF竞赛中的移动安全题目分析和实际Flutter应用的安全评估。

Flutter框架应用逆向分析实战指南 一、Flutter框架概述 Flutter是Google开源的应用开发框架,具有以下核心特性: 跨平台编译 :一套代码库可编译为ARM/Intel机器码及JavaScript 原生性能 :直接编译为原生平台代码,性能接近原生应用 多设备支持 :支持移动端、网页、桌面和嵌入式设备 架构特点 :在安卓中几乎完全抛弃Java层,主要逻辑实现在native层 识别特征: APK中包含 libapp.so 和 libflutter.so 主入口函数继承自Flutter父类,不直接创建页面 二、逆向分析工具链 1. reFlutter工具 安装 : 使用流程 : 执行重打包命令: 选择功能: 选项1:流量监控和拦截 选项2:获取函数偏移地址(逆向分析选择此项) 签名重打包后的APK: 输出结果 : 在应用私有目录( /data/data/包名 )生成 dump.dump 文件 需要root权限访问 2. Blutter工具 安装准备 : Windows环境需要Visual Studio组件 从GitHub克隆源码 安装命令 : 使用流程 : 启动VS的"x64 Native Tools Command Prompt" 执行分析命令: 输出文件 : 恢复的符号表文件 IDA脚本文件 IDA整合 : 打开 libapp.so File → Script file → 导入生成的py脚本 恢复符号表 三、实战分析技巧 1. 关键函数定位 搜索main函数 : 在IDA函数窗口中搜索"main" 识别包含业务逻辑的函数(如 babyapk$main__MyHomePageState::test_264c0c ) Frida动态分析 : 2. 动态调试技巧 SO库断点设置 : 对关键so( librust_lib_babyapk.so )的所有导出函数下断点 跟踪 frb_pde_ffi_dispatcher_sync 等关键函数 Flag格式分析 : 通过动调识别格式特征(如包含"-"分隔符) 提取有效部分进行验证(去除分隔符后的连续字符串) 3. 算法逆向与求解 Z3求解器应用 : 求解步骤 : 定义变量和值域(通常ASCII可打印字符) 添加从逆向分析得到的方程约束 使用求解器获取满足条件的字符值 组合得到完整Flag 四、典型问题解决方案 Flutter应用无Java层逻辑 : 重点分析 libapp.so 和 libflutter.so 使用Blutter/reFlutter恢复符号 关键逻辑在第三方SO中 : 对导出函数全面下断 跟踪FFI调用接口 复杂验证算法 : 使用符号执行工具(如Z3) 将验证逻辑转化为约束方程 动态生成代码 : 结合Frida进行运行时Hook Dump内存中的关键数据 五、完整分析流程总结 识别框架 :检查APK中的SO文件 符号恢复 :使用Blutter/reFlutter 静态分析 :IDA分析关键函数 动态验证 :Frida Hook/Fuzz 算法逆向 :动调跟踪验证逻辑 约束求解 :Z3等工具自动化求解 结果验证 :构造完整Flag提交测试 通过这套方法论,可有效分析大多数Flutter框架开发的应用程序,特别适用于CTF竞赛中的移动安全题目分析和实际Flutter应用的安全评估。