从bytectf中的一道题开始分析futter框架软件
字数 1400 2025-08-23 18:31:08
Flutter框架应用逆向分析实战指南
一、Flutter框架概述
Flutter是Google开源的应用开发框架,具有以下核心特性:
- 跨平台编译:一套代码库可编译为ARM/Intel机器码及JavaScript
- 原生性能:直接编译为原生平台代码,性能接近原生应用
- 多设备支持:支持移动端、网页、桌面和嵌入式设备
- 架构特点:在安卓中几乎完全抛弃Java层,主要逻辑实现在native层
识别特征:
- APK中包含
libapp.so和libflutter.so - 主入口函数继承自Flutter父类,不直接创建页面
二、逆向分析工具链
1. reFlutter工具
安装:
pip install reflutter
使用流程:
- 执行重打包命令:
reflutter test.apk
-
选择功能:
- 选项1:流量监控和拦截
- 选项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
使用流程:
- 启动VS的"x64 Native Tools Command Prompt"
- 执行分析命令:
python blutter.py path/to/app/lib/arm64-v8a out_dir
输出文件:
- 恢复的符号表文件
- IDA脚本文件
IDA整合:
- 打开
libapp.so - File → Script file → 导入生成的py脚本
- 恢复符号表
三、实战分析技巧
1. 关键函数定位
-
搜索main函数:
- 在IDA函数窗口中搜索"main"
- 识别包含业务逻辑的函数(如
babyapk$main__MyHomePageState::test_264c0c)
-
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. 动态调试技巧
-
SO库断点设置:
- 对关键so(
librust_lib_babyapk.so)的所有导出函数下断点 - 跟踪
frb_pde_ffi_dispatcher_sync等关键函数
- 对关键so(
-
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("无解")
求解步骤:
- 定义变量和值域(通常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应用的安全评估。