ARTICLE · 980965
工控 APP 分析
工控 CTF 里,除了 PLC、协议流量和固件,还有一类题目会把战场搬到手机 APP 上。间谍用伪装的工业 APP 把机密传出去,选手的任务就是从 APK 里把藏匿逻辑和 flag 揪出来。
一道简单的 APK 搜 flag、一道 TeslaMultiSCADA 多层加密逆向、还有一道只给题干的练习。我会把前两道题的分析思路拆开,重点是拿到一个工控 APP 后该看什么、怎么挖。
一、热身:Tesla.APK 里的"买一送二"
第一道题很直白:给你一个 特斯拉.APK,直接丢进 AndroidKiller 反编译。反编译后看到两个文件:
- modbus.APK
(题目里写成了 Modbusdrid.apk) - tesla.scada
(或者 multiprotocol.tesla.scada)

先别急着看 modbus,名字里带 SCADA 的那个才是正主。把 tesla.scada 解压,能看到 classes.dex,接着就是 Android 逆向里最常用的老办法:在反编译后的文件里搜 flag。这道题很给面子,直接搜到了 flag。
二、正题:TeslaMultiSCADA 间谍 APP 逆向
2.1 题目设定与第一印象
第二道题就没那么友好了。题目描述是:某安全团队捕获间谍发送的工业 APP,怀疑间谍以某种方式把机密信息传出去,要求分析文件并找出 flag。
拿到手的是 TeslaMultiSCADA 软件,但版本号已经被改过,避免选手直接拿正版 APP 对比。有经验的选手会同时反编译这个被修改过的 APK 和正版 APP(比如 1.10.3 版本),从差异里找异常。
2.2 异常点:一个伪装成字体文件的 APK
对比反编译结果后,很快能发现有一个 APK 被伪装成了字体文件。这种"文件类型伪装"在 CTF 里特别常见:后缀名改了、放在 assets 或 res 目录里,想让你一眼掠过去。
把这个伪装文件还原成 APK 后,发现它被加固保护了。接下来有两个常见选择:
- 静态脱壳
:用 IDA 分析 so,手动还原 datadiv_decode10352206657073544814 这类字符串解密函数。 - 动态调试
:把 APP 跑起来,字符串会在运行时被自动解密,再用调试器跟踪。
2.3 Java 层:先过 base85
脱壳后先看 Java 层。题目要求输入一行字符串,Java 层用 base85 编码,然后传给 so 层。也就是说,Java 层负责把用户输入做一次 base85,然后把结果交给 native 函数。
这里的关键函数入口是 Java_bin_crack_easyandroid_MainActivity_stringFromJNI。这个函数本身没有复杂逻辑,核心在 sub_2E74。

跟踪 sub_2E74 时,so 里还有字符串加密保护。如果静态跟不动,建议直接动态调试:APP 跑起来后字符串会自动解密,省时省力。不过要注意,这个 APK 有断点扫描检测,发现调试断点会直接崩溃,所以下断点要挑关键子函数。
2.4 so 层:变异 SM4 与变异 base91
在 so 层里,重点盯两个函数:
- sub_1228
:变异 SM4 算法,ECB 模式。 - sub_DA4
:变异 base91 算法。
到这一步,加密链已经清楚了:
但还缺两样东西:SM4 密钥和最终密文。这两样东西不会直接躺在 so 里,需要去资源文件和 smali 代码里翻。
其中 base91 的字母表被改过,这是 CTF 里"变异 base91"的典型特征。IDA 里可以看到自定义的字母表,跟标准 base91 对不上。

2.5 找密文:三处藏点与排列组合
对 APK 的资源文件做反混淆后,能在几个意想不到的位置找到密文片段:
- functions_fr.properties
文件 - smali/d/a/a/a/b/a
文件 - smali/android/support/v7/internal/view/menu/ActionMenuItemView
文件
这三处密文的编码方式还不一样,题目玩了一个障眼法:有些看起来像摩尔斯电码,其实是 brainfuck;有些看着像 brainfuck,其实是摩尔斯电码;还有的就是 brainfuck。需要逐个识别、转换,得到三段原始密文。
三段密文拿到手之后,要做排列组合:总有一个顺序能让 base91 解码、SM4 解密、base85 解码 这条路走通,最终输出 flag。
2.6 爆破脚本验证
知道了 SM4 的魔改方式后,可以用 Python 写个爆破脚本遍历所有可能。指南里给出的脚本思路是:把密文每个字节减 1 后尝试解密,因为这道题对 SM4 的魔改之一是 S 盒整体做了偏移。

跑出正确结果后,就能拿到 SM4 密钥。结合三段密文做排列组合,最终解出的 flag 格式为 flag{...}。flag 值我隐在资料包里,正文不剧透。
三、拿到工控 APP 后,我的排查顺序
把两道题串起来,我通常按下面这个顺序分析一个可疑的工控 APP:
| AndroidManifest.xml | ||
在线下比赛或者断网环境里,这套流程完全可以靠一台装了 IDA/JADX/AndroidKiller 的电脑完成,不需要联网。
四、写在最后
工控 APP 分析本质上还是 Android 逆向,只不过出题人会在场景上下功夫:伪装成工业软件、嵌套 APK、把密文塞进资源文件、用摩斯和 brainfuck 互相伪装。你只要把"拆包、找异常、跟入口、识别算法"这条线走顺,遇到同类型题就不会被场景吓到。