题目摘要
SkillWeb & browsingGuides your agent through solving a KCTF 2026 Android APK reverse engineering challenge step by step.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the 题目摘要 skill
About this skill
KCTF 2026 Problem 6 Android APK reverse engineering: JNI hybrid flow, odd/even channel separation, XOF/ARX state machine, 46-bit sparse Boolean gate SAT solving, TEA/LCG key recovery.
What this skill tells your AI
The instructions your AI receives, as published by manyuegong33/r0crawl_skills in skills/kctf2026-题6-书院迷局/SKILL.md and read by ahel’s review.
目标文件为 Android APK(KCTF2026.apk)。输入为 100 个小写十六进制字符,Java 层解码为 50 字节后调用 JNI 函数。native 层将输入奇偶解交织为两个 25 字节通道,分别经过不同的变换和校验。
可验证常量
- 输入:100 个小写 hex 字符 = 50 字节
- 奇偶分离:
even[i] = input[2*i],odd[i] = input[2*i+1] - 16 字节密钥:
870573e5f5c63d52862dbd05ab3d9494 - 32 字节隐藏目标:
9f73be24a1dd6c96b90723bba7cdfdc9fd521311dd1b172572014429f93dd77c - 最终 flag:
a77a7ae3781bff946ad2945636f87d0c1b414eb7b4293f8eaa638da5e2dfb310044b00c8bd72533d3d96e80f55e4345843ad
标准解法流程
-
Java 层与 JNI 入口分析
- 确认输入格式:100 hex chars → 50 bytes
- 定位 JNI 函数:
nativeProcessInput - 识别
.init_array中的反调试初始化(读取/proc/self/status的TracerPid)
-
密钥恢复
- Java 层读取自身 APK,解析 ELF 节表,定位 96 字节
.kctfguard节 - 结合 CRC、节偏移和节大小生成 32 字节数据
- 与固定向量异或得到 16 字节 native 密钥
- Java 层读取自身 APK,解析 ELF 节表,定位 96 字节
-
去混淆语义
- 识别并替换基础函数:
sub_E818(a,b,noise) = a XOR b、sub_EE90(a,b) = a + b等 - 删除成对的
InvMixColumns(MixColumns(x)) = x结构 - 识别
mix32散列函数及其在 SIMD 中的并行计算
- 识别并替换基础函数:
-
Odd 通道:XOF/ARX 状态机
- XOF 输入:
odd25 || 5a5a5a5a5a5a5a(32 字节) - 轮函数:基于
ror64/rol64的 ARX 结构,可逆 - 校验要求
XOF[80:96]等于隐藏目标前 16 字节 - 通过逆推固定 XOF 初始状态中的
c和d
- XOF 输入:
-
46 位稀疏布尔门
- 每个输出位仅依赖输入
b的 2-5 位 - 对每个输出位枚举局部真值表,生成 CNF 阻断子句
- 使用 SAT 求解器(如 Z3)求解,结合 XOF 逆函数筛选有效解
- 每个输出位仅依赖输入
-
Even 通道:TEA/LCG 状态机
- 可逆字节置换和链式状态变换
- 标准 TEA 常量
delta = 0x9e3779b9,16 轮 - 32 位 LCG 生成轮密钥:
seed = seed * 1664525 + 1013904223 - 使用 CUDA 暴力枚举 32 位 seed,通过三组 KAT 验证
-
合并与验证
- 按原输入布局交织两个 share:
flag_bytes = bytes(x for pair in zip(even25, odd25) for x in pair) - 在原始 APK 或提取的样本上验证,不依赖反编译伪代码
- 按原输入布局交织两个 share:
可复用检查清单
- 识别 JNI 混合流程,分离 Java 层和 native 层校验
- 处理奇偶通道分离和独立状态机
- 对 XOF/ARX 结构进行逆推,利用已知输出约束固定初始状态
- 对稀疏布尔门使用局部 SAT 求解而非全局约束
- 对 TEA/LCG 等标准算法使用 GPU 加速暴力枚举
- 在原始 APK 上验证,不依赖反编译结果
Signals
- GitHub stars
- 285
- Forks
- 100
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Key
kctf2026-6- Source
- github.com/manyuegong33/r0crawl_skills