首页
社区
课程
招聘
[原创]flutter逆向 ACTF native app
发表于: 2023-10-31 20:01 22915

[原创]flutter逆向 ACTF native app

2023-10-31 20:01
22915

算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~

flutter逆向的一大难点就是不知道libapp.so的函数名,虽然有工具reflutter可以帮助我们得到其中的符号,但是我个人认为基于对libflutter.so源码插桩后重编译再重打包apk的方式具有极大的不可预料性,极有可能导致apk闪退,这一题便出现了这种情况,所以接下来我将介绍的工具blutter是纯静态分析来还原函数名,更令人惊喜的是它提供了IDApython脚本来让我们可以在IDA中对函数进行重命名,而这个项目中提供的其他文件也相当好用

blutter项目地址

在各个平台如何编译在这个项目的README.md中写的已经相当详细了,这里我就简单介绍一下Windows上的编译过程吧,注意一下这些命令需要全程运行在代理环境否则会导致无法下载

首先clone项目

随后运行初始化脚本

请注意,接下来我们需要打开x64 Native Tools Command Prompt,它可以在Visual Studio文件夹中找到

image-20231031182720564

然后运行blutter.py并提供libapp.solibflutter.so的文件夹路径以及输出文件夹路径

image-20231031183050383

输出文件夹目录如下

image-20231031183135453

随后我们用ida反编译libapp.so,并运行输出文件夹中的IDApython脚本ida_script/addNames.py,符号就被全部恢复出来啦

image-20231031183441477

这里我们需要关注的函数是flutter_application_1_main__LongPressDemoState::_onTap,因为在flutter的开发中,onTap函数是按钮点击之后的响应函数

image-20231031183702090

随后我们进入sub_1DE500,在该函数中双击sub_1DE59C进入

image-20231031183814522

在这个函数中我们发现了256,%,^这些特征,合理猜测一下算法可能是RC4image-20231031185252569

image-20231031185414233

image-20231031185438467

接下来我们使用输出文件夹中的blutter_frida.jshook一下sub_1DE59C看看情况

image-20231031185604019

这里我们只hook到一个数组的值,另一个数组的类型是TypeArguments,研究了一下blutter_frida.js后发现作者还没有对这种数据类型格式提供hook支持

image-20231031185952753

现在我们得到了一个数组,我们就暂时认为它就是flag经过加密之后得到的结果,接下来我们在IDA中对sub_1DE59C下断点动态调试来更加深入的研究一下

首先我们需要将IDA文件夹中的dbgsrv/android_server64 push到手机上面,然后运行一下并且指定端口

随后端口转发一下

在IDA中选择调试器为Android debugger

image-20231031190502580

随后点击Debugger->Debugger options...选择如下配置

image-20231031190621711

点击Debugger->Process options...,Hostname修改为127.0.0.1,Port修改为11112

image-20231031190653343

然后点击Debugger->Attach to process...,附加到我们目标包名的进程上面

image-20231031190932527

弹出该弹窗选择Same即可

image-20231031191001330

在手机上点击按钮,然后在IDA中点击这个绿色的剪头,就可以动态调试啦

image-20231031191049306

image-20231031191123141

在动态调试之后,未知的变量也逐渐浮现了出来,这里我们发现了v28>=256,那么很有可能就是RC4了哦

image-20231031191544680

既然这样,那么直接在这里唯一的异或的地方用IDA去trace一下,把异或的数组dump下来不就行了:)

image-20231031192301154

于是我们得到了被异或的数组了

image-20231031193001825

但是在异或运算的地方下断点之后,我输入的数全都是1,这里被异或的数也全是0xce

image-20231031194118997

所以莫非不是RC4?让0xce和0x31异或一下看看,竟然是0xff这么有意义的数字

image-20231031194218233

所以exp也就能写出来啦~

https://github.com/worawit/blutter
https://github.com/worawit/blutter
git clone https://github.com/worawit/blutter --depth=1
git clone https://github.com/worawit/blutter --depth=1
cd .\blutter\
python .\scripts\init_env_win.py
cd .\blutter\
python .\scripts\init_env_win.py
python .\blutter.py ..\chall\lib\arm64-v8a\ .\output
python .\blutter.py ..\chall\lib\arm64-v8a\ .\output
PS D:\hgame\ACTF\native app\work\blutter> frida -U -f "com.example.flutter_application_1" -l .\output\blutter_frida.js
[Pixel 3::com.example.flutter_application_1 ]->
Unhandle class id: 46, TypeArguments
GrowableList@6d00488c29 = [
  188676,
  0,
  {
    "key": "Unhandle class id: 46, TypeArguments"
  },
  34,
  {
    "key": [
      184,
      132,
      137,
      215,
      146,
      65,
      86,
      157,
      123,
      100,
      179,
      131,
      112,
      170,
      97,
      210,
      163,
      179,
      17,
      171,
      245,
      30,
      194,
      144,
      37,
      41,
      235,
      121,
      146,
      210,
      174,
      92,
      204,
      22
    ]
  },
  0,
  0,
  0
]
PS D:\hgame\ACTF\native app\work\blutter> frida -U -f "com.example.flutter_application_1" -l .\output\blutter_frida.js
[Pixel 3::com.example.flutter_application_1 ]->
Unhandle class id: 46, TypeArguments
GrowableList@6d00488c29 = [
  188676,
  0,
  {

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 22
支持
分享
最新回复 (35)
雪    币: 209
活跃值: (1079)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好贴,火钳刘明,明天试试手动复现一下
2023-10-31 23:01
0
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-11-1 09:50
1
雪    币: 226
活跃值: (1414)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
flutter IDA动态调试断下一段时间后经常会无法恢复运行,然后报错
2023-11-1 10:58
0
雪    币: 3505
活跃值: (4763)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
hpphpp flutter IDA动态调试断下一段时间后经常会无法恢复运行,然后报错
先在输入框中输入字符串之后再点按钮,然后到IDA中点击绿色的箭头来动态调试,要是在IDA运行的时候弹出小键盘的话会有概率导致无法运行的
2023-11-1 11:34
0
雪    币: 478
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
oacia 先在输入框中输入字符串之后再点按钮,然后到IDA中点击绿色的箭头来动态调试,要是在IDA运行的时候弹出小键盘的话会有概率导致无法运行的
楼主,现在flutter app的抓包有什么工具么,最近遇到的几个只要一抓包就直接掉登录,之前的hook方法不起效果,wireshark抓包走的是https,直接尬住了
2023-11-1 16:44
0
雪    币: 244
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7


1、作者源码中只有这两种架构:EM_AARCH64、EM_IA_64,而我的so文件是em_arm架构,走到这里就报错了。


2、修改了一下问题一里的架构判断,先绕了过去,后边又出现了报错,经过调试发现:executable为None,导致系统找不到要启动的进程



希望能够得到帮助。。。

2023-11-2 18:06
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2023-11-4 18:49
0
雪    币: 226
活跃值: (1414)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
oacia 先在输入框中输入字符串之后再点按钮,然后到IDA中点击绿色的箭头来动态调试,要是在IDA运行的时候弹出小键盘的话会有概率导致无法运行的
即使调试自己的app,不涉及输入,断下分析一段时间后也会无法恢复,不知道怎么回事. 
2023-11-6 11:59
0
雪    币: 212
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
mb_eiaothcj 楼主,现在flutter app的抓包有什么工具么,最近遇到的几个只要一抓包就直接掉登录,之前的hook方法不起效果,wireshark抓包走的是https[em_47],直接尬住了
hookssl无效么?
2023-11-6 14:24
0
雪    币: 478
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
mb_ezphxtar hookssl无效么?
不是一定要走ssl的,而且那个方法都出来多久了,老早不管用了
2023-11-9 00:36
0
雪    币: 212
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
mb_eiaothcj 不是一定要走ssl的,而且那个方法都出来多久了,老早不管用了
可否分享下app研究下?
2023-11-9 09:38
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
支持一下 大佬的文章属实精彩
2023-11-10 22:21
0
雪    币: 2340
活跃值: (10417)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大佬你的博客崩溃了
2023-11-13 15:49
0
雪    币: 3505
活跃值: (4763)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
15
你瞒我瞒 大佬你的博客崩溃了
不是崩了是域名过期了这个月比较忙,下个月初我把域名重新买回来
2023-11-13 16:39
1
雪    币: 313
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
[1/22] Building CXX object CMakeFiles/blutte...vm2.19.2_android_arm64.dir/cmake_pch.hxx.gch
FAILED: CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx.gch 
/usr/bin/c++ -DDART_COMPRESSED_POINTERS -DDART_PRECOMPILED_RUNTIME -DDART_TARGET_OS_ANDROID -DDART_TARGET_OS_WINDOWS_UWP -DEXCLUDE_CFE_AND_KERNEL_PLATFORM -DFRIDA_TEMPLATE_DIR=\"/root/blutter/scripts\" -DHAS_TYPE_REF -DNDEBUG -DPRODUCT -DTARGET_ARCH_ARM64 -DU_USING_ICU_NAMESPACE=0 -D_HAS_EXCEPTIONS=0 -I/usr/include/capstone -isystem /root/blutter/packages/include/dartvm2.19.2 -O3 -DNDEBUG -O3 -fno-rtti -fvisibility=hidden -fvisibility-inlines-hidden -fno-omit-frame-pointer -std=c++20 -Winvalid-pch -x c++-header -include /root/blutter/build/blutter_dartvm2.19.2_android_arm64/CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx -MD -MT CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx.gch -MF CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx.gch.d -o CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx.gch -c /root/blutter/build/blutter_dartvm2.19.2_android_arm64/CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx.cxx
In file included from /root/blutter/build/blutter_dartvm2.19.2_android_arm64/CMakeFiles/blutter_dartvm2.19.2_android_arm64.dir/cmake_pch.hxx:5,
                 from <command-line>:
/root/blutter/blutter/src/pch.h:12:10: fatal error: format: No such file or directory
   12 | #include <format>
      |          ^~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "/root/blutter/blutter.py", line 138, in <module>
    main(args.indir, args.outdir, args.rebuild, args.vs_sln)
  File "/root/blutter/blutter.py", line 120, in main
    cmake_blutter(blutter_name, dartlib_name, macros)
  File "/root/blutter/blutter.py", line 76, in cmake_blutter
    subprocess.run([NINJA_CMD], cwd=builddir, check=True)
  File "/usr/lib/python3.11/subprocess.py", line 571, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['ninja']' returned non-zero exit status 1.
我己经安装 g++13 了
2023-11-20 17:03
0
雪    币: 514
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
C:\Users\Administrator\Desktop\blutter-main>python blutter.py ./app ./output
Dart version: 2.17.5, Snapshot: 1441d6b13b8623fa7fbf61433abebd31, Target: android arm64
libapp is loaded at 0x236e1a40000
Dart heap at 0x23700000000
Analyzing the application
C:\Users\Administrator\Desktop\blutter-main\blutter\src\CodeAnalyzer_arm64.cpp: 124: error: expected: dartCls->Id() >= dart::kNumPredefinedCids

C:\Users\Administrator\Desktop\blutter-main> 失败了
2023-12-17 01:22
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
https://segmentfault.com/a/1190000044464286
这个文章是搬运的吗?
2023-12-21 16:35
0
雪    币: 3505
活跃值: (4763)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
19
xzy____ https://segmentfault.com/a/1190000044464286 这个文章是搬运的吗?
看了一下应该是别的师傅参考这里的文章复现了ACTF的这题,说明我写的内容还是有意义的:)
2023-12-21 18:37
0
雪    币: 590
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
师傅,我运行那个blutter_frida脚本,然后let报语法错误,您知道如何解决吗,对这个还不是很熟悉

2023-12-21 22:00
0
雪    币: 1030
活跃值: (202)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
师傅我trace有问题,一直打印出14,具体的步骤可以教一下吗
2023-12-28 21:57
0
雪    币: 3505
活跃值: (4763)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
22
mb_ykhckzcr 师傅我trace有问题,一直打印出14,具体的步骤可以教一下吗

你需要点一下这个勾号确认文本框的提交 ,

点击提交之后在"submitted:"后面出现你输入的字符串才算是正确的把输入给输进去了,不然你的输入就是空字符串

2023-12-29 19:44
0
雪    币: 454
活跃值: (741)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢分享,遇到了一个flutter app,按照步骤试一下
2024-1-23 13:20
0
雪    币: 2160
活跃值: (3290)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
请问以下使用blutter时候提示找不到dartsdk\v3.0.2该如何处理?
C:\Users\TDTX001\Downloads\blutter-main\blutter\dartsdk\v3.0.2
Traceback (most recent call last):
  File "C:\Users\TDTX001\Downloads\blutter-main\blutter\blutter.py", line 169, in <module>
    main(args.indir, args.outdir, args.rebuild, args.vs_sln, args.no_analysis)
  File "C:\Users\TDTX001\Downloads\blutter-main\blutter\blutter.py", line 131, in main
    fetch_and_build(dart_version, arch, os_name, has_compressed_ptrs, snapshot_hash)
  File "C:\Users\TDTX001\Downloads\blutter-main\blutter\dartvm_fetch_build.py", line 122, in fetch_and_build
    outdir = checkout_dart(ver, snapshot_hash)
  File "C:\Users\TDTX001\Downloads\blutter-main\blutter\dartvm_fetch_build.py", line 53, in checkout_dart
    subprocess.run([GIT_CMD, '-c', 'advice.detachedHead=false', 'clone', '-b', ver, '--depth', '1', '--filter=blob:none', '--sparse', '--progress', DART_GIT_URL, clonedir], check=True)
  File "C:\Users\TDTX001\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 501, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\TDTX001\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 969, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\TDTX001\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1438, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
2024-1-29 16:59
0
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25

这是什么问题?

2024-4-1 14:12
0
游客
登录 | 注册 方可回帖
返回
//