flutter逆向 ACTF native ap

算了一下好长时间没打过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 = [1841321372151466586157123100179131112170972101631791717124530194,

         14437412351211462101749220422]

xor = [14146880292012414619720812379187552341044011713312671379131136,

       17764234242726214122217]

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

print(''.join(flag))

# Iu2xpwXLAK734btEt9kXIhfpRgTlu6KuI0

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

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

相关文章

容器安全是什么?

容器安全定义 容器安全是指保护容器的完整性。这包括从其保管的应用到其所依赖的基础架构等全部内容。容器安全需要完整且持续。通常而言,企业拥有持续的容器安全涵盖两方面: 保护容器流水线和应用保护容器部署环境和基础架构 如何将安全内置于容器流…

【MySQL 系列】MySQL 语句篇_DQL 语句

DQL(Data Query Language),即数据查询语言,用来查询数据记录。DQL 基本结构由 SELECT FROM、WHERE、JOIN 等子句构成。 DQL 语句并不会改变数据库,而是让数据库将查询结果发送结果集给客户端,返回的结果是一…

代理IP以及动态拨号VPS的关系是什么?

在数字时代,网络安全和隐私保护已成为全球关注的热点话题。代理IP和动态拨号VPS作为提升网络匿名性和安全的重要技术,它们在维护网络隐私中扮演着至关重要的角色。虽然这两种技术在表面上看似相似,实际上它们在功能、应用场景以及用户需求满足…

生成对抗网络 (GAN)

生成对抗网络(Generative Adversarial Networks,GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成:一个生成器(Generator)和一个判别器(Discriminator)&…

window vscode安装node.js

window vscode安装node.js 官网下好vscode 和nodejs 选.msi的安装 点这个安装 下载完 继续安装 完毕后倒杯水喝个茶等2分钟 重启VScode 或者在cmd 运行 npm -v node -v 显示版本号则成功

借助Aspose.html控件,在 Java 中将 URL 转换为 PDF

如果您正在寻找一种将实时 URL 中的网页另存为 PDF文档的方法,那么您来对地方了。在这篇博文中,我们将学习如何使用 Java 将 URL 转换为 PDF。从实时 URL转换HTML网页可以像任何其他文档一样保存所需的网页以供离线访问。将网页保存为 PDF 格式可以轻松突…

金智维售前总监屈文浩,将出席“ISIG-RPA超级自动化产业发展峰会”

3月16日,第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导,企智未来科技(RPA中国、AIGC开放社区、LowCode低码时代)主办。大会旨在聚合每一位产业成员的力量,深入探索R…

windows关闭copilot预览版

如果用户不想在windows系统当中启用Copilot,可以通过以下三种方式禁用。 第一种:隐藏Copilot 按钮 右键点击任务栏,取消勾选“显示 Copilot(预览版)按钮”,任务栏则不再显示,用户可以通过快捷键…

[N1CTF 2018]eating_cms 不会编程的崽

题倒是不难,但是实在是恶心到了。 上来就是登录框,页面源代码也没什么特别的。寻思抓包看一下,数据包直接返回了sql查询语句。到以为是sql注入的题目,直到我看到了单引号被转义。。。挺抽象,似乎sql语句过滤很严格。又…

C语言分析基础排序算法——插入排序

目录 插入排序 直接插入排序 希尔排序 希尔排序基本思路解析 希尔排序优化思路解析 完整希尔排序文件 插入排序 直接插入排序 所谓直接插入排序,即每插入一个数据和之前的数据进行大小比较,如果较大放置在后面,较小放置在前面&#x…

Flutter使用auto_updater实现windows/mac桌面应用版本升级功能

因为windows应用一般大家都是从网上下载的,后期版本肯定会更新,那用flutter开发windows应用,怎么实现应用内版本更新功能了?可以使用auto_updater库, 这个插件允许 Flutter 桌面 应用自动更新自己 (基于 sparkle 和 wi…

生活的色彩--爱摸鱼的美工(17)

题记 生活不如意事十之八九, 恶人成佛只需放下屠刀,善人想要成佛却要经理九九八十一难。而且历经磨难成佛的几率也很小,因为名额有限。 天地不仁以万物为刍狗! 小美工记录生活,记录绘画演变过程的一天。 厨房 食…

单调栈(例题+解析)

1、应用场景 找出一个数的左面离概述最近的且小于该数的数&#xff08;同理右面也可以&#xff09; 例如&#xff1a; 数组a[i] 3 4 2 7 5 答案&#xff1a; -1 3 -1 2 2 2、如何实现找到规律 暴力写法&#xff1a; for(int i0;i<n;i) {for(int ji-1;j>0;j--){i…

在ubuntu上使用vscode+gcc-arm-none-eabi+openocd工具开发STM32

文章目录 所需工具安装调试搭建过程中遇到的问题 写在前面 老大上周让我用vscode开发STM32&#xff0c;我爽快的答应了&#xff0c;心想大学四年装了这么多环境了这不简简单单&#xff0c;更何况vscode这两年还用过&#xff0c;然而现实总是令人不快的——我竟然花了差不多两周…

UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议

我要成为嵌入式高手之3月7日Linux高编第十七天&#xff01;&#xff01; ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端&#xff1a; #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…

PHP在线图像处理程序:基于Photoshop的网页版图片处理源码

PHP在线PS修图网页版源码&#xff1a;实现照片图片处理的便捷工具 众所周知&#xff0c;许多朋友都喜欢使用PS进行图像编辑。然而&#xff0c;PS需要下载软件并对电脑配置要求较高。今天我们为大家带来一款基于浏览器的在线PS网页版源码&#xff0c;让您轻松实现在线P图和作图…

Kafka MQ 主题和分区

Kafka MQ 主题和分区 Kafka 的消息通过 主题 进行分类。主题就好比数据库的表&#xff0c;或者文件系统里的文件夹。主题可以被分为若干个 分区 &#xff0c;一个分区就是一个提交日志。消息以追加的方式写入分区&#xff0c;然 后以先入先出的顺序读取。要注意&#xff0c;由…

【论文阅读】Mamba:选择状态空间模型的线性时间序列建模(一)

文章目录 Mamba:选择状态空间模型的线性时间序列建模介绍状态序列模型选择性状态空间模型动机&#xff1a;选择作为一种压缩手段用选择性提升SSM 选择性SSM的高效实现先前模型的动机选择扫描总览&#xff1a;硬件感知状态扩展 Mamba论文 Mamba:选择状态空间模型的线性时间序列建…

软件测试入门

文章目录 一、入门1. 软件2. 软件基本组成3. 软件产生过程4. 软件测试5. 软件测试目的&#x1f3c6; 小结 二、测试主流技能1. 功能测试2. 自动化测试3. 接口测试4. 性能测试&#x1f3c6; 小结 三、测试分类1. 按测试阶段划分2. 按代码可见度划分&#x1f3c6; 小结 三、质量模…

数字人ai直播软件突破AI大模型技术,改变未来科技格局!

数字人AI直播软件在AI大模型技术上的突破&#xff0c;将不可避免地改变未来科技格局。这一突破让人们看到了AI技术的无限可能性&#xff0c;并为未来的科技发展打开了新的大门。 AI大模型技术是近年来人工智能领域的一个热点&#xff0c;它通过构建庞大、复杂的神经网络模型&a…