Android逆向题解 攻防世界难度4- Android2.0
Jeb打开apk
关键代码在Native函数getResult

IDA 打开 so
发现代码比较简单,可以直接静态分析。
输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余=1,第三段是除3取余等于2;
bool __fastcall Java_com_example_test_ctf03_JNI_getResult(JNIEnv *a1, int a2, int a3)
{int v3; // r4const char *v4; // r8char *v5; // r6char *v6; // r4char *v7; // r5int i; // r0int j; // r0v3 = 0;v4 = (*a1)->GetStringUTFChars(a1, a3, 0); //输入字符串if ( strlen(v4) == 15 ) //判断输入字符串长度==15{v5 = malloc(1u);v6 = malloc(1u);v7 = malloc(1u);Init(v5, v6, v7, v4, 15); //输入字符串分成三段if ( !First(v5) ) //第一部分比较return 0;for ( i = 0; i != 4; ++i )v6[i] ^= v5[i];if ( !strcmp(v6, " 5-\x16a") ) //第二部分比较{for ( j = 0; j != 4; ++j )v7[j] ^= v6[j];return strcmp(v7, "AFBo}") == 0; //第三部分比较}else{return 0;}}return v3;
}Init 字符串分成三段
int __fastcall Init(int result, char *a2, char *a3, const char *a4, int a5)
{int v5; // r5int v6; // r10int v7; // r6if ( a5 < 1 ){v6 = 0;}else{v5 = 0;v6 = 0;do{v7 = v5 % 3;if ( v5 % 3 == 2 ) //除3取余 == 2 是第3段{a3[v5 / 3u] = a4[v5];}else if ( v7 == 1 ) //除3取余 == 1 是第2段{a2[v5 / 3u] = a4[v5];}else if ( !v7 ){++v6;*(result + v5 / 3u) = a4[v5]; //除3是第1段}++v5;}while ( a5 != v5 );}*(result + v6) = 0;a2[v6] = 0;a3[v6] = 0;return result;
}
计算第一段
就是一个异或运算,注意这里只计算了4位,第5位不用算就是“l”;
First处理第一段
bool __fastcall First(char *a1)
{int i; // r1for ( i = 0; i != 4; ++i )a1[i] = (2 * a1[i]) ^ 0x80; //经过运算后判断是否== LN^dl ,先乘以2再异或0x80, 反推就是用 LN^dl先异或0x80再除以2return strcmp(a1, "LN^dl") == 0;
}
可以算出第一段的值是 fgorl
char[] chars = new char[]{'L','N','^','d','l'};char[] res = new char[5];for (int i = 0; i < 4; i++) {res[i] = (char) ((chars[i] ^ 0x80)/2);}res[4] = 'l';System.out.println(res);
计算第二段
第二段也是一个异或,同样也只算4位,第5位不用异或计算。注意这里的v5 不是上面计算出来的第一段的值,是上面异或之后的也就是“LN^dl” ,
for ( i = 0; i != 4; ++i )v6[i] ^= v5[i];if ( !strcmp(v6, a5A) )
可以算出第二段的值 是 l{sra
char[] c2 = new char[]{0x20,0x35,0x2D,0x16,0x61}; //a5Achar[] r2 = new char[5];for (int i = 0; i < 4; i++) {r2[i] = (char) (chars[i]^c2[i]); //chars 是上面的 LN^dl}r2[4] = 0x61;System.out.println(r2);
计算第三段
一样的套路,还是异或计算4位,第5位直接照搬是“}”
for ( j = 0; j != 4; ++j )v7[j] ^= v6[j];return strcmp(v7, "AFBo}") == 0;
可以计算出第三段 是 asoy}
char[] c3 = new char[]{0x41, 0x46, 0x42, 0x6F, 0x7D}; // "AFBo}"char[] r3 = new char[5];for (int i = 0; i < 4; i++) {r3[i] = (char) (c2[i] ^ c3[i]);}r3[4] = 0x7D;System.out.println(r3);
组合起来就是flag
三段数据组合起来就是flag了
第一段:fgorl -------------整除3,对应的下标就是0,3,6,9,12
第二段:l{sra -------------除3余1,对应下标就是1,4,7,10,13
第三段:asoy} -------------除3余2,对应下标就是2,5,8,11,14
组合结果就是:flag{sosorryla}
完整计算代码:
public static void main(String[] args) {char[] chars = new char[]{'L','N','^','d','l'};char[] res = new char[5];for (int i = 0; i < 4; i++) {res[i] = (char) ((chars[i] ^ 0x80)/2);}res[4] = 'l';System.out.println(res);//第二段char[] c2 = new char[]{0x20,0x35,0x2D,0x16,0x61};char[] r2 = new char[5];for (int i = 0; i < 4; i++) {r2[i] = (char) (chars[i]^c2[i]);}r2[4] = 0x61;System.out.println(r2);//第三段char[] c3 = new char[]{0x41, 0x46, 0x42, 0x6F, 0x7D};char[] r3 = new char[5];for (int i = 0; i < 4; i++) {r3[i] = (char) (c2[i] ^ c3[i]);}r3[4] = 0x7D;System.out.println(r3);//还原StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < 5; i++) {stringBuilder.append(res[i]);stringBuilder.append(r2[i]);stringBuilder.append(r3[i]);}System.out.println(stringBuilder);}
相关文章:
Android逆向题解 攻防世界难度4- Android2.0
Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单,可以直接静态分析。 输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余1,第三段是除3取余等于2࿱…...
P4155 [SCOI2015] 计划
[SCOI2015] 计划 - 洛谷 核心思路 注意到, 可推出, 表示 战士 走 步到达战士位置。 若可以走到且 r < 终点 则答案 然后再加上自己这个哨兵,和走回自己的一个哨兵即可。 AC 代码 #include<bits/stdc.h> using namespace std…...
今日(2024年8月12日)科技新闻
国内: 航空航天领域 我国成功发射卫星互联网高轨卫星。我国试验性冰川保护项目取得积极成效,被形容为“为冰川盖棉被”。2024西太平洋国际航次科考队起航,开启探秘深海海山之旅。我国首架固定翼海上专业搜救航空器正式列编。“祥云”as700载…...
CP AUTOSAR标准之ECUStateManager(AUTOSAR_SWS_ECUStateManager)(更新中……)
1 简介和功能概述 ECU管理器模块(如本文档中所述)是一个基本软件模块(参见[1]),用于管理ECU状态的常见方面。具体来说,ECU管理器模块: 初始化和取消初始化OS、SchM和BswM以及一些基本软件驱动模块。根据请求配置ECU进入休眠和关机状态。管理ECU上的所有唤醒事件ECU管理器模块…...
Java中的中介者模式:解耦复杂系统的有效策略
Java中的中介者模式:解耦复杂系统的有效策略 在软件开发中,随着系统规模的扩大和复杂度的增加,各组件之间的直接交互会导致代码的耦合性增高,从而影响系统的可维护性和可扩展性。为了应对这种复杂性,中介者模式&#…...
transformer(李宏毅老师系列)
自学参考: Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq:输入一个序列的向量作为input,output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…...
XCode15.4真机运行调试
更新Xcode后,没有模拟器内容,而且真机也不显示,编译按钮无法点击,设备在管理运行目标中可见,但无法选中解决方案:下载iOS17.5模拟器,但最坑的是直接点击“Get”下载总是中断,且无法断…...
Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)
文章目录 环境的配置方法1:从源代码构建第一步:克隆库的源代码第二步:构建库 方法 2:使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…...
shell外壳与Linux权限
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…...
越混越好的项目经理做对了哪些事?现在知道还不晚
作为一名项目经理,你最害怕的是什么? 是做不完的项目?延迟的进度条?还是团队人心涣散? 很多人都知道,得人心者得天下,一个成功的领导者,一定是能做到让人心服口服的。如果失去了团…...
haproxy是什么?以及haproxy基础实验
目录 一、什么是负载均衡? 二、为什么要用haproxy? 三、haproxy的基本部署实验: 3.1 基本配置实验 环境准备: 详细步骤: 3.2 haproxy-多进程与多线程实验: 多进程: 多线程:…...
【向量数据库】向量数据库的构建和检索
1、使用 sentence-transformers 将文本编码为向量 安装 sentence-transformers: pip install -U sentence-transformers在 huggingface 下载 all-MiniLM-L6-v2 模型权重(1_Pooling 是文件夹,里面包含一个 config.json 文件)&…...
Mysql基础篇之DQL语言
Mysql基础篇之DQL语言 1. 基础查询特点语法格式闲言碎语 2. 条件查询语法格式条件表达式逻辑表达式模糊查询 3. 排序查询4. 常见函数单行函数1. 字符函数2. 数学函数3. 日期函数4. 流程控制函数5. 其他函数 分组函数 5. 分组查询分组函数语法格式特点 6. 多表连接查询分类SQL 七…...
python async
要使用 Python 的 async 特性编写一个代码,以交替使用两个 AI API 处理数据,您可以按照以下步骤进行。假设这两个 AI API 的调用是异步的,并且我们需要在两个 API 之间轮流处理一组数据。 import asyncio import aiohttp async def call_ap…...
利用QT和FFmpeg实现一个简单的视频播放器
在当今的多媒体世界中,视频播放已成为不可或缺的一部分。从简单的媒体播放器到复杂的视频编辑软件,视频解码和显示技术无处不在。本示例使用Qt和FFmpeg构建一个简单的视频播放器。利用ffmpeg解码视频,通过QWidget渲染解码后的图像,…...
怎么用云手机进行TikTok矩阵运营
TikTok作为炙手可热的社交媒体巨头,已经吸引了亿万用户的目光。随着科技的飞速发展,云手机的出现为TikTok矩阵运营注入了新的活力。本文将深入探讨云手机在TikTok矩阵运营中的实际应用,并分享一系列高效策略与技巧。 (1࿰…...
TCP/IP 协议及其协议号
协议号十六进制协议号协议介绍10x1ICMP (Internet Control Message Protocol)20x2IGMP (Internet Group Management Protocol) 30x3GGP (Gateway-to-Gateway Protocol) 40x4IPv4 (encapsulation) 50x5ST (Stream Protocol) 60x6TCP (Transm…...
【传知代码】机器情绪及抑郁症算法 四(论文复现)
在现代心理健康研究中,抑郁症一直是一个备受关注的课题。随着科学的进步,研究人员逐渐认识到,抑郁症的成因远不止单一因素,而是由复杂的生物学、心理学和社会环境因素交织而成的。最近,MSA(综合性综合性模型…...
C#开启和关闭UAC功能
在开发软件或制作安装包时,有时会需要管理员权限 ,但是又不想弹出UAC对话框。 可以编写一个小工具,检测UAC是否关闭。如果没有关闭,就自动关闭UAC。 实现比较简单, 找到注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE…...
LVS的简单配置及对Mysql主从复制的补充
Day 22 LVS的配置 环境准备 DSN() 用来解析各主机的域名和ip地址,配置域名解析huajuan,负责管理其他主机 web1--->web1.tangpin.huajuan web2--->web2.tangpin.huajuan dns--->dns.tangpin.huajuan web1(192.168.2.200) 用nginx…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
