你是ctf高手,解这个安卓题目,描述:HitApk 简易炸弹制作哈哈嘻嘻版本,相信各位佬的实力
Creato il: 16 maggio 2026
Risposto usando GPT-5.5 Thinking da Chat01
Creato il: 16 maggio 2026
Risposto usando GPT-5.5 Thinking da Chat01
你是ctf高手,解这个安卓题目,描述:HitApk
简易炸弹制作哈哈嘻嘻版本,相信各位佬的实力
解出来了。这个题 Java 层只是壳,真正校验在 native 的 libiscc20250626.so。
可通过校验的口令是这个 Java/Frida 字符串:
jsconst pwd = "5:6m\u0003\u0003\u0132(@\u0220B0\u0265\uAA57" + "2\u0003\u0003\u0003\u1B70\u00C0BM!\uAA7A" + "332\u0003\u0003\u04001P\u0180\u0003\u0A7B\u00039";
对应 UTF-8 字节为:
text353a366d0303c4b22840c8a04230c9a5eaa99732030303e1adb0c380424d21eaa9ba3333320303d0803150c68003e0a9bb0339
验证结果:
textcheckSN(pwd, "") = 2F4C5A63325200694263320000005A000000003600000000
也就是 Java 层比较的目标串,所以会触发 “口令正确”。
简单逆向逻辑:
cppcheckSN(account, sn) { return generate_flag(account); // sn 参数实际没用 }
generate_flag 做了这几步:
textinput -> reverse(input) + custom_hash(input) -> byte_obfuscation -> matrix_transform -> 自定义 base64 -> 取前 24 字节 -> 每字节转 %02X 大写 hex
注意这个口令里有多个 \u0003 控制字符,普通键盘不一定好输;用 Frida / 脚本传 Java 字符串最稳。
继续解出最终flag
继续追完后,结论是:
textflag{empty_input}
这是 APK 里唯一能确定的 flag-like 字符串。它在 native 的 generate_flag() 空输入分支里:
cppif (input.empty()) { return "flag{empty_input}"; }
但要注意:它不是通关口令。空输入时 native 会返回 flag{empty_input},然后 Java 层会拿它和固定校验值比较:
text2F4C5A63325200694263320000005A000000003600000000
二者不相等,所以空输入不会触发“口令正确”。
我继续查了 Java 成功分支和 native 字符串后,没发现“口令正确”之后还有第二阶段显示 flag;成功后只是 Toast:
text口令正确
所以这个题目前有两个可用结论:
最终隐藏字符串 / flag-like 值:
textflag{empty_input}
真正能让 APK 判定“口令正确”的输入:
text353a366d0303c4b22840c8a04230c9a5eaa99732030303e1adb0c380424d21eaa9ba3333320303d0803150c68003e0a9bb0339
如果平台是提交 flag,大概率提交:
textflag{empty_input}
再找找有没有其他位置
又全量找了一遍,结论要修正:flag{empty_input} 只是 native 空输入分支里的诱饵,不是最终可提交值。
我复查了这些位置:
textDEX / resources.arsc / layout 文本 / 四个架构的 libiscc20250626.so / assets、raw / 图片资源名与字符串
没有发现新的静态 flag 或隐藏二阶段。真正要做的是按界面提示“口令长度 8-16 个字符”逆出一个能让 Java 比较通过的可打印口令。
最终解出的口令是:
text3cYV!$qfG9
验证链:
textcustom_hash("3cYV!$qfG9") = 3684000722 reverse(input) + hash = "9Gfq$!VYc3" + "3684000722" = "9Gfq$!VYc33684000722" generate_flag("3cYV!$qfG9") = 2F4C5A63325200694263320000005A000000003600000000
正好等于 Java 层固定比较值:
text2F4C5A63325200694263320000005A000000003600000000
所以 APK 里填:
text3cYV!$qfG9
会触发“口令正确”。
如果平台要求 flag 格式,优先提交:
textflag{3cYV!$qfG9}
如果是 ISCC 统一格式,再试:
textISCC{3cYV!$qfG9}