奇怪的APP - CTF逆向题Writeup
发布时间:2026/9/24 19:41:05 作者:尧图编辑部 阅读量:1,286

奇怪的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?!!!}