flutter逆向 ACTF native app

前言

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

还原函数名

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

blutter的编译及使用

blutter项目地址

1

https://github.com/worawit/blutter

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

首先clone项目

1

git clone https://github.com/worawit/blutter --depth=1

随后运行初始化脚本

1

2

cd .\blutter\

python .\scripts\init_env_win.py

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

image-20231031182720564

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

1

python .\blutter.py ..\chall\lib\arm64-v8a\ .\output

image-20231031183050383

输出文件夹目录如下

image-20231031183135453

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

image-20231031183441477

hook关键函数 获取函数参数

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

image-20231031183702090

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

image-20231031183814522

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

image-20231031185252569

image-20231031185414233

image-20231031185438467

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

image-20231031185604019

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

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

]

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

image-20231031185952753

IDA动态调试libapp.so

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

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

1

2

3

blueline:/data/local/tmp # ./as64 -p 11112

IDA Android 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022

Listening on 0.0.0.0:11112...

随后端口转发一下

1

2

PS C:\Users\oacia> adb forward tcp:11112 tcp:11112

11112

在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也就能写出来啦~

1

2

3

4

5

6

7

8

final = [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]

xor = [14, 14, 68, 80, 29, 201, 241, 46, 197, 208, 123, 79, 187, 55, 234, 104, 40, 117, 133, 12, 67, 137, 91, 31, 136,

       177, 64, 234, 24, 27, 26, 214, 122, 217]

flag = [chr(xor[i]^final[i]^0xff) for i in range(len(final))]

print(''.join(flag))

# Iu2xpwXLAK734btEt9kXIhfpRgTlu6KuI0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/137298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题-Redis底层的SDS、ZipList、ListPack

Redis 的 SDS 了解吗? 答: Redis 创建了 SDS(simple dynamic string) 的抽象类型作为 String 的默认实现 SDS 的结构如下: struct sdshdr {// 字节数组,用于保存字符串char buf[];// buf[]中已使用字节…

介绍YOLO-NAS Pose:姿势估计的技术

YOLO-NAS 姿势 YOLO-NAS Pose models是对 Pose Estimation 领域的最新贡献。今年早些时候,Deci 因其突破性的目标检测基础模型 YOLO-NAS 获得了广泛认可。在 YOLO-NAS 成功的基础上,该公司现在推出了 YOLO-NAS Pose 作为其姿势估计的对应产品。该姿势模型在延迟和准确性之间…

linux入门---自旋锁和读写锁

自旋锁 首先通过一个例子来带着大家理解自旋锁,在生活中大家肯定都等过人比如你们一家人准备出去玩可是出发的时候妻子发现自己还没有化妆于是连忙赶回了家这个时候其他人就得在楼下等着,但是这个等又分为两种情况第一种是真的在楼下等其他的什么事都没…

DeCLIP 论文阅读

DeCLIP:supervision exists everywhere:a data efficient contrastive language-image pre-training paradigm 贡献: 论文是为了充分利用单模态和多模态,充分利用单模态特征用自监督(SIMSAM和MLM),多模态用图像文本对…

P6入门:项目初始化4-项目详情之预算日志及汇总Budget

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

ELK之Logstash解析时间相差8h的问题

一、问题描述 服务器当前时间为:2022年 06月 28日 星期二 11:24:22 CST 而logstash解析的时间为2022-06-28T03:15:25.545Z与实际时间相差8h 一、解决办法: 需改logstash的配置文件: 原理就是:定义一个中间变量timestamp&…

Unity如何保存场景,如何导出工程文件/如何查看保存位置?【各版本通用】

如何保存场景? 在unity中CtrlS 或者File—>Save 输入你要保存的场景名【建议保存在Scenes文件夹下】 下图,保存场景不在Scenes文件夹下: 下图,保存在Scenes文件夹下: 下图,保存完成 如何导出工程文…

nginx配置和热部署实践

目录 一、nginx配置文件 1.配置文件 2.nginx配置文件语法 3.include 二、nginx.conf参数 1.user参数 2.nginx.conf重要的指令块 3.nginx命令行 三、nginx热部署功能实践 1.热部署的特点 2.大致流程 3.环境准备 4.备份旧nginx二进制文件 5.下载编译安装新的nginx …

Mac电脑配置Flutter开发环境

1.进入官网下载页: Flutter SDK releases | Flutter 可以看到有 Windows、macOS、Linux三种系统的下载包 选择macOS,然后点击下载 Stable channel(稳定版)中的最新版本,下载完成后可以移动到资源库Library中。 2.下载…

Unity Input System最简单使用

开始学的是 Input Manager 比较好理解,Input System却不好理解,教程也找了很多,感觉都讲的不清楚,我这里做一个最简单的用 Input System 添加鼠标左键和右键的效果。 1. 安装 Input System 包 首先这个功能不是内置的&#xff0…

Flutter笔记:使用Flutter构建响应式PC客户端/Web页面-案例

Flutter笔记 使用Flutter构建响应式PC客户端/Web页面-案例 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/detai…

红黑树,AVLTree树(平衡二叉树)迭代器原理讲解

红黑树,AVLTree树底层实现逻辑都是平衡二叉树(AVLTree高度平衡,红黑树以某种规则平衡),但终究不像链表的迭代器那样逻辑简单。 简单叙述以下,二叉树上面迭代器的运行逻辑,根据下面的图&#xff…

leetcode-链表经典题

1.反转单链表 206. 反转链表https://leetcode.cn/problems/reverse-linked-list/这里我们使用创建一个变量cur来遍历原链表,再创建一个新节点newnode,首先使用一个循环来遍历原链表,cur为NULL是循环结束,每次进入循环将cur的下一…

.mallab勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言: .mallab勒索病毒是一种极具威胁性的数字病毒,通过高级加密算法深度侵袭用户文件,迫使受害者支付赎金以获取解密密钥。了解其侵害方式和对抗手段对数字安全至关重要。数据的重要性不容小觑,您可添加我们的技术服务号&#x…

threejs(12)-着色器打造烟雾水云效果

一、自己封装水波纹效果 src/main/main01.js import * as THREE from "three";import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; import gsap from "gsap"; import * as dat from "dat.gui"; import ver…

【文件IO】

文章目录 File常见方法和属性属性构造方法方法 InputStream方法FileInputStream OutputStream利用 OutputStreamWriter 进行字符写入 总结按字节读取数据按字节写入数据按字符读取数据按字符写入数据 File常见方法和属性 属性 修饰符及类型属性说明static StringpathSeparato…

网络安全(黑客技术)-高效自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

思科设备静态路由配置

一、静态路由基本知识 路由器的主要功能就是用来转发IP 数据包以使数据包到达正确的目的主机。可以想象数据包到达路由器就像一辆汽车开到十字路口,路由表就类似路标,列出可能到达的目的地,以及应该选择哪条路到达目的地。 路由器必须要有相应…

Linux - 基础IO(重定向 - 重定向模拟实现 - shell 当中的 重定向)- 下篇

前言 上一篇博客当中,我们对 文件 在操作系统当中是 如何就管理的,这个问题做了 详细描述,本篇博客将基于上篇 博客当中的内容进行 阐述,如有疑问,请参考上篇博客: Linux - 基础IO(Linux 当中…

应用层——HTTP协议

文章目录 HTTP协议1.HTTP简介2.认识URL3.urlencode和urldecode4.HTTP协议格式(1)HTTP请求协议格式(2)HTTP响应协议格式 5.HTTP的方法6.HTTP的状态码7.HTTP常见的Header8.Cookie和Session HTTP协议 1.HTTP简介 HTTP(Hy…