奇怪的APP - CTF逆向题Writeup题目信息题目名称奇怪的APP分值100 pts类型软件逆向工程难度入门描述这个apk安装后怎么怪怪的怎么什么内容都没有。用jadx打开看看呢也许走两步flag就掉出来了吧吧吧吧吧一、环境准备1.1 安装Java环境# 安装OpenJDK 17aptinstallopenjdk-17-jdk-headless-y# 验证安装java--versionjavac--version1.2 下载并安装jadx# 下载jadx预编译版本wgethttps://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip# 解压unzipjadx-1.5.0.zip# 进入bin目录cdjadx-1.5.0/bin# 给执行权限chmodx jadx jadx-gui# 验证安装./jadx--version二、反编译APK2.1 使用jadx反编译# 基本反编译命令./jadx-doutput chall11.apk# 参数说明# -d : 指定输出目录# output : 输出文件夹名称# chall11.apk : 要反编译的APK文件2.2 查看反编译结果# 查看输出目录结构ls-laoutput/# 查看所有Java文件findoutput-name*.java-typef# 查看AndroidManifest.xmlcatoutput/resources/AndroidManifest.xml三、定位Flag片段3.1 搜索Base64编码字符串# 搜索所有Base64编码的字符串长度≥6可能以结尾grep-r-E[A-Za-z0-9/]{6,}{0,2}output/--coloralways|\grep-v.class|grep-v.dex|grep-v.smali|\grep-v.png|grep-v.jpg参数说明-r: 递归搜索-E: 使用扩展正则表达式--coloralways: 高亮显示匹配内容grep -v: 排除特定文件类型3.2 查看特定文件# 查看AndroidManifest.xmlcatoutput/resources/AndroidManifest.xml# 查看strings.xmlcatoutput/resources/res/values/strings.xml# 查看config.jsoncatoutput/resources/assets/config.json# 查看MainActivity.javacatoutput/sources/com/moectf/apkreverse/MainActivity.java四、解码Base64片段4.1 命令行解码# 解码单个Base64字符串echobW9lY3Rme0Fwa19S|base64-d# 输出: moectf{Apk_RechoX2Z1Tl9yMQ|base64-d# 输出: _fuN_r1echoZ2hUPyEhIX0|base64-d# 输出: ghT?!!!}echoRXYzcnNlXzFz|base64-d# 输出: Ev3rse_1s4.2 Python脚本解码importbase64# 所有片段fragments[bW9lY3Rme0Fwa19S,X2Z1Tl9yMQ,Z2hUPyEhIX0,RXYzcnNlXzFz]# 解码并拼接flagforfinfragments:decodedbase64.b64decode(f).decode(utf-8)print(f{f}-{decoded})flagdecodedprint(f\n完整Flag:{flag})五、完整搜索脚本5.1 一键搜索所有线索#!/bin/bash# 文件名: find_flag.shecho 1. 搜索所有Base64编码 grep-r-E[A-Za-z0-9/]{6,}{0,2}output/--coloralways2/dev/null|\grep-v.class|grep-v.dex|grep-v.png|grep-v.jpg|\grep-vSHA-256|grep-vDigestecho-e\n 2. 查看AndroidManifest.xml catoutput/resources/AndroidManifest.xml2/dev/null|grep-Epermission|meta-dataecho-e\n 3. 查看所有XML资源文件 findoutput-name*.xml-execgrep-H-E[A-Za-z0-9/]{6,}{0,2}{}\;2/dev/nullecho-e\n 4. 查看所有JSON文件 findoutput-name*.json-execcat{}\;2/dev/nullecho-e\n 5. 查看MainActivity catoutput/sources/com/moectf/apkreverse/MainActivity.java2/dev/nullecho-e\n 6. 提取所有Base64片段 grep-r-o-E[A-Za-z0-9/]{8,}{0,2}output/2/dev/null|\grep-v.class|grep-v.dex|sort-u运行脚本chmodx find_flag.sh ./find_flag.sh5.2 Python自动化提取脚本#!/usr/bin/env python3# 文件名: extract_flag.pyimportosimportreimportbase64defextract_base64_strings(directory):提取目录下所有文件中的Base64字符串patternre.compile(r[A-Za-z0-9/]{8,}{0,2})results[]forroot,dirs,filesinos.walk(directory):forfileinfiles:# 跳过二进制文件iffile.endswith((.class,.dex,.png,.jpg)):continuefilepathos.path.join(root,file)try:withopen(filepath,r,encodingutf-8,errorsignore)asf:contentf.read()matchespattern.findall(content)formatchinmatches:iflen(match)8:results.append({file:filepath,encoded:match,decoded:base64.b64decode(match).decode(utf-8,errorsignore)})except:passreturnresults# 提取所有Base64片段resultsextract_base64_strings(output)# 显示结果print(找到的Base64片段)print(-*60)forrinresults:print(f文件:{r[file]})print(f编码:{r[encoded]})print(f解码:{r[decoded]})print(-*60)# 手动拼接根据实际顺序调整fragments[bW9lY3Rme0Fwa19S,RXYzcnNlXzFz,X2Z1Tl9yMQ,Z2hUPyEhIX0]flagforfinfragments:flagbase64.b64decode(f).decode(utf-8)print(f\n完整Flag:{flag})六、发现的所有Base64片段位置编码解码AndroidManifest.xmlbW9lY3Rme0Fwa19Smoectf{Apk_Rstrings.xmlX2Z1Tl9yMQ_fuN_r1config.jsonZ2hUPyEhIX0ghT?!!!}MainActivity.javaRXYzcnNlXzFzEv3rse_1s七、拼接Flag按正确顺序拼接moectf{Apk_R Ev3rse_1s _fuN_r1 ghT?!!!}最终Flagmoectf{Apk_REv3rse_1s_fuN_r1ghT?!!!}八、解题思路总结8.1 题目设计特点代码混淆方法名使用OooO0o0()等混淆名称信息分散Flag被分成4段藏在不同位置编码隐藏所有片段都经过Base64编码组合拼接需要找到正确的顺序Leet Speak使用数字替换字母3→e1→i8.2 解题步骤✅ 使用jadx反编译APK✅ 搜索Base64编码的字符串✅ 逐个解码片段✅ 按正确顺序拼接✅ 提交Flag8.3 常用命令汇总# 1. 安装Javaaptinstallopenjdk-17-jdk-headless-y# 2. 下载jadxwgethttps://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip# 3. 解压jadxunzipjadx-1.5.0.zip# 4. 反编译APK./jadx-doutput app.apk# 5. 搜索Base64grep-r-E[A-Za-z0-9/]{6,}{0,2}output/# 6. Base64解码echoencoded_string|base64-d# 7. 查看文件内容catoutput/resources/AndroidManifest.xmlcatoutput/resources/res/values/strings.xmlcatoutput/resources/assets/config.jsoncatoutput/sources/com/moectf/apkreverse/MainActivity.java九、知识点回顾Android逆向工具jadx、apktoolBase64编码识别特征为大小写字母数字可能以结尾正则表达式[A-Za-z0-9/]{6,}{0,2}匹配Base64信息隐藏Flag可以分散存储在多个位置Leet Speak数字替换字母的常见变形最终答案moectf{Apk_REv3rse_1s_fuN_r1ghT?!!!}
企业数字化 ERP 产品动态
相关推荐
Python电影数据分析与可视化毕业设计:从数据清洗到答辩PPT全流程 简介:这份资源是面向计算机相关专业学生与项目实战学习者的Python电影数据分析及可视化毕业设计完整资料包,适合正在做毕设、课程设计或期末大作业的同学直接参考使用。压缩包共39个文件,约20.87MB,包含Python源码、答辩PPT、项目… · 2026/9/24 19:41:06
Builde可视化网页制作教程:从拖拽搭建到代码导出全流程 上个月帮朋友的工作室赶一个作品展示页,本来计划手写 HTML 和 CSS,结果因为临时加了三个板块、要响应式适配,掐指一算根本没时间。最后换成了 Builde 这款可视化网页制作工具,从搭建、调样式到导出一份能继续二次开发的完整页面&a… · 2026/9/24 19:41:06
番茄工作法在软件测试中的实战应用与落地指南 我想先聊一个场景:你坐在工位上,刚把一条用例的前置数据准备好,正准备开始执行,微信弹了需求变更,紧接着测试环境挂了,等环境的时候顺手刷了十分钟网页,等环境好了,刚才那条用例的逻… · 2026/9/24 20:24:23
外贸必备:集装箱类型、尺寸对照与装柜计算全攻略 做外贸这些年,我最大的体会是:很多新手一开始把精力全扑在找客户、谈价格上,结果货快出了,却在"装什么柜子、能装多少、怎么装"上栽了跟头。集装箱的类型与尺寸,看似是物流环节里最不起眼的基础知识… · 2026/9/24 20:24:23
重组人IL-6蛋白实验应用全攻略:从信号通路到临床转化 在生物医学实验室泡久了的人,对IL-6这个名字绝对不会陌生。白介素-6(Interleukin-6)可以说是整个炎症网络里最核心的枢纽分子之一,几乎所有跟免疫、炎症、肿瘤、自身免疫病相关的课题,绕来绕去都会碰到它。但真正动手去… · 2026/9/24 20:24:17
IL-6重组蛋白研究从信号通路到临床应用的完整指南 我们实验室和IL-6打交道快十年了,从最初拿重组蛋白做细胞增殖实验,到后来用各种突变体和中和抗体去拆解信号通路,再到近几年参与几个抗体药物的临床前评估,这一路踩过的坑、积累的经验,确实值得好好写一写。很多人问我… · 2026/9/24 20:24:17
Flask+微信小程序构建寻亲平台:全栈实战与部署指南 “宝贝回家”这几个字,对做技术的人来说,不应该只是新闻里的感人故事。它背后是一个极其典型的 Web 全栈实战场景:地理位置、图片存储、模糊搜索、状态流转、消息通知,全部都在一个小程序里。用 Flask 做后端,配合微信… · 2026/9/24 20:24:17
蓝牙SoC产线反复升级问题排查:以中科蓝讯BT5756C为例 做蓝牙音频方案这些年,中科蓝讯的芯片没少折腾,BT5756C算是我手里出镜率比较高的一颗。前两天刚好有个做耳机的客户找过来,说产线测试盒升级固件的时候遇到了个怪现象:固件烧进去了,板子也重启了,可没跑两秒… · 2026/9/24 20:24:17
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44