饶派杯XCTF车联网安全挑战赛Reverse GotYourKey

文章目录

  • 一.程序逻辑分析
  • 二.线程2的operate方法解析
  • 三.找出真flag

一.程序逻辑分析

onCreate方法中判断SDK版本是否>=27
在这里插入图片描述
然后创建两个线程
第一个线程是接受输入的字符串并发送出去
第二个线程用于接受数据
在这里插入图片描述
线程1,就是将字符串转为字节数组发送出去
在这里插入图片描述
线程2,作为服务端接受数据并进行处理
在这里插入图片描述

二.线程2的operate方法解析

这部分主要是用于混淆的代码,很多没有实际作用
在这里插入图片描述
有一个方法是根据buffer来截取后一段数据,照着程序逻辑分析可以得出buffer分三段,一段是下标0~3,中间一段是topic(stringData),最后一段是messageData
不过这里都不是很重要可以直接忽略
在这里插入图片描述
主要在于check方法,跟进可以发现是aes加密
在这里插入图片描述
不过要注意这里的base64换了表,并且填充符不是’=‘而是’^’
在这里插入图片描述
解密:

  1. base64解密
import base64
str1 = "UGCA3QBFjPnlAZ6-NbV2Ca=="#将^替换为==即可
string1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-+"#换表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
bytes=base64.b64decode(str1.translate(str.maketrans(string1,string2)))
value=int.from_bytes(bytes,byteorder='big')
print(hex(value))
#得到base64解密后的16进制数据0xe2a9a477496927334b93d83ec41e5c98
  1. aes解密

在这里插入图片描述
不过很不幸这里是假的flag

三.找出真flag

可以发现apk文件的assets目录下有一个bin文件,但是不知道具体内容是什么
在这里插入图片描述
MainActivity这里也导入了一个库,那么很有可能是这里做了些手脚
在这里插入图片描述

stringFromJni是默认的,没有什么特殊操作
在这里插入图片描述
JNI_Load里面有不少函数调用,笨方法逐个查看
在这里插入图片描述
这个sub_21868就是关键函数了,跟进之后也可以找到打开asset.bin文件的操作(这里如果用字符串查找会更快)
在这里插入图片描述
再往下看可以看到"goodluck"字符串,这可能是加密密钥,跟进之后可以发现是一个rc4加密
到这里可以大概看出是将asset.bin文件打开后进行rc4解密
解密asset.bin文件:

def rc4(data, key):
    S = list(range(256))
    j = 0
    out = []
    # KSA
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
    # PRGA
    i = j = 0
    for char in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        out.append(char ^ S[(S[i] + S[j]) % 256])
    return bytes(out)
# Read the encrypted file
with open('asset.bin', 'rb') as f:
    encrypted_data = f.read()
# Decrypt the data
decrypted_data = rc4(encrypted_data, b'goodluck')
# Write the decrypted data to a new file
with open('decrypted_file', 'wb') as f:
    f.write(decrypted_data)

解密后的文件可以看到dex的标识
在这里插入图片描述
将解密后的dex文件用jadx打开,可以发现大部分逻辑还是和之前的结果一样,最主要的差别就是check函数不同,这里是rc4加密和rc4最后调用的base64加密
在这里插入图片描述
解密:

  1. base64解密
import base64
str1 = "SSro3CogRALMhCnQRBDyWa=="

string1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-+"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
bytes=base64.b64decode(str1.translate(str.maketrans(string1,string2)))
value=int.from_bytes(bytes,byteorder='big')
print(hex(value))
#0xdb644e766386d64bf01e6374d659d8e8

2.rc4解密
在这里插入图片描述
输出结果有乱码,将输出结果设置为16进制,然后用16进制转字符串网站即可
在这里插入图片描述
根据题目提示最终flag是md5(flag{ikjnmkjh±$})

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

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

相关文章

springboot动态加载json文件

resources下面的配置文件,application文件修改启动会实时加载新的内容 其他的文件属于静态文件,打包后会把文件打入jar里面,修改静态文件启动不会加载新的内容 Resource areacode nre FileSystemResource("config" File.separa…

STM32——07-STM32定时器Timer

定时器介绍 软件定时 缺点:不精确、占用 CPU 资源 void Delay500ms () //11.0592MHz { unsigned char i , j , k ; _nop_ (); i 4 ; j 129 ; k 119 ; do { do { while ( -- k ); } while ( -- j ); } while ( -- i ); } 定时器工…

Springboot--关于自定义stater的yml无法提示

1.前言 在以前在搭建架构的时候就碰到了类似的情况,在使用EnableConfigurationProperties注解的时候,不管怎样,在项目中引入了该starter的情况下依然不发自动的提示properties里面的属性。 Data ConfigurationProperties(prefix "pro…

vite vs babel+webpack | 创建一个简单的vite项目打包运行

有babel、webpack这些优秀的框架,为什么使用vite? 因为vite编译快,启动快,使用简单,还自带一个热更新重启的服务器,vite能够自动的帮我打包所用到的依赖,有些依赖只有用到才会导入,不用到不会…

开放式耳机和封闭式耳机的区别?开放式耳机到底有哪些优缺点?

开放式耳机从字面意思可以理解为:开放耳朵,不需要入耳就可以听见声音的耳机,所以它和封闭式耳机的最大区别就是不入耳。这种耳机最大的优点就是不压迫不封闭耳道,而且在听耳机音的同时能够及时注意到周围环境的声音,从…

【图神经网络】5分钟快速了解Open Graph Benchmark

10分钟快速了解Open Graph Benchmark Open Graph Benchmark (OGB)安装OGB简单使用节点分类任务数据集链路预测任务数据集图属性预测任务数据集Large-Scale Graph ML Datasets 内容来源 Open Graph Benchmark (OGB) Open Graph Benchmark(OGB)是用于图机…

从一个线上 Android Bug 回看 Fragment 的基础知识

作者:Kotlin上海用户组 公司的项目在最近遇到了一个与 Fragment 有关的线上 crash,导致这个问题的根本原因比较复杂,导致修复方案的可选项非常有限,不过这个问题的背景、crash 点,以及修复过程都非常有趣,值…

【RabbitMQ教程】第四章 —— RabbitMQ - 交换机

💧 【 R a b b i t M Q 教 程 】 第 四 章 — — R a b b i t M Q − 交 换 机 \color{#FF1493}{【RabbitMQ教程】第四章 —— RabbitMQ - 交换机} 【RabbitMQ教程】第四章——RabbitMQ−交换机💧 🌷 仰望天空,妳我亦是…

共创开源生态 | 小米肖翔荣获“2023中国开源优秀人物”奖

6月15-16日,以“开源创新 数字化转型 智能化重构”为主题的“第十八届开源中国・开源世界高峰论坛”在北京成功召开。小米工程师肖翔凭借其在 Apache 基金会的开源贡献及在操作系统领域内的技术突破,荣获“2023中国开源优秀人物”奖。 Xiaomi …

使用VitePress创建个人网站并部署到GitHub

网站在线预览 参考文档: VitePress 创建 GitHub 远程仓库 克隆远程仓库到本地 git clone gitgithub.com:themusecatcher/front-end-notes.git进入 front-end-notes/ 目录,添加 README.md 并建立分支跟踪 echo "# front-end-notes" >>…

nand flash 介绍

flash名称由来 Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将一个block,常见的块的大…

FAQ页面在SaaS产品中的应用

随着云计算和软件即服务(SaaS)的快速发展,越来越多的企业选择将业务迁移到云端,以更好地管理和运营他们的业务。在这种背景下,SaaS产品的出现成为了企业管理和运营的新趋势。SaaS产品通过云端的方式,为企业…

Godot 4 源码分析 - 命令行参数

粗看Godot 4的源码&#xff0c;稍微调试一下&#xff0c;发现一大堆的命令行参数。在widechar_main中 Error err Main::setup(argv_utf8[0], argc - 1, &argv_utf8[1]); Main::setup中&#xff0c;各命令行参数加入到List<Stirng> args中&#xff0c;并通过OS::get…

腾讯云服务器地域有什么区别?怎么选比较好

腾讯云服务器地域有什么区别&#xff1f;云服务器地域怎么选择&#xff1f;地域是指云服务器所在机房的地理位置&#xff0c;用户距离地域越近网络延迟越低&#xff0c;速度越快&#xff0c;所以地域就近选择即可。广州上海北京等地域网站域名需要备案&#xff0c;中国香港或其…

基于三种机器学习模型的岩爆类型预测及Python实现

写在前面 由于代码较多&#xff0c;本文仅展示部分关键代码&#xff0c;需要代码文件和数据可以留言 然而&#xff0c;由于当时注释不及时&#xff0c;且时间久远&#xff0c;有些细节笔者也记不清了&#xff0c;代码仅供参考 0 引言 岩爆是深部岩土工程施工过程中常见的一种地…

实现Vue3和UE5.2进行通信(Pixel Streaming)

文章目录 1. 从UE5.2到前端页面的通信1.1 编写蓝图脚本1.2 编写前端的响应函数1.3 功能验证 2. 从Vue3到UE5.2的信息发送2.1 UE5.2蓝图的设计2.2 前端发送消息功能的实现2.3 功能验证 3. 参考资源 这篇文章简单讲解一下如何实现vue3和UE5进行数据的通信。 如果有同学还不清楚如…

微服务链路追踪SkyWalking的介绍和部署

skywalking和链路追踪 SkyWalking介绍 首先我们要明白一点&#xff0c;在微服务的架构中&#xff0c;为什么要做链路追踪&#xff1f;解决问题的痛点在哪里&#xff1f;其实无外乎是如下几个问题&#xff1a; 如何将整个调用链路串起来&#xff0c;并能够快速定位问题&#…

通过GPIO子系统编写LED驱动,应用程序控制LED灯亮灭

1、在内核设备树中添加设备信息&#xff1a; LED1的设备树编写需要参考内核的帮助文档&#xff1a; linux-5.10.61/Documentation/devicetree/bindings/gpio 在根节点内部添加led灯设备树节点 :~/linux-5.10.61/arch/arm/boot/dts $ vi stm32mp157a-fsmp1a.dts myled.c #in…

选择排序 - C语言实现

目录 &#x1f970;前言 ✅选择排序 &#x1f95d;基本思想 &#x1f95d;实现逻辑 &#x1f95d;动图演示 复杂度分析 &#x1f60d;代码实现 &#x1f6a9;优化改进-->二元选择排序 &#x1f60d; 改进代码 前言 &#x1f970;在学数据结构的第一节课就知道了数据结…

React 通过一个输入内容加入列表案例熟悉 Hook 基本使用

我们创建一个react项目 在src下创建components文件夹 在下面创建一个index.jsx index.jsx 参考代码如下 import React, { useState } from "react";const useInputValue (initialValue) > {const [value,setValue] useState(initialValue);return {value,onCha…