OpenHarmony CTF arkts+ezAPP_And_SERVER
字数 1932 2025-08-30 06:50:12
OpenHarmony CTF arkts+ezAPP_And_SERVER 详细解析
一、题目概述
这是一个关于鸿蒙(HarmonyOS)应用程序分析的CTF题目,包含两部分内容:
- arkts部分 - 分析鸿蒙hap文件中的加密逻辑
- ezAPP_And_SERVER部分 - 分析应用程序与服务器交互的认证机制
二、鸿蒙应用程序分析基础
1. HAP文件结构
- HAP文件是鸿蒙应用程序包,类似于Android的APK
- 本质上是ZIP格式,可以直接解压
- 核心代码位于
task_4\ets\modules.abc中
2. ABC文件解析
- ABC文件是"ArkCompiler Bytecode"(方舟编译器字节码)的缩写
- 是鸿蒙应用源代码经过ArkCompiler编译后生成的字节码文件
- 类似于Java的.class文件或Android的DEX文件
- 可以使用
abcdecompiler工具反编译(基于jadx开发)
三、arkts部分详细解析
1. 主函数分析
- 主函数逻辑位于
pages下的index文件 - 定义了多个属性,包括加密函数
enc
2. 加密函数分析
enc函数使用了多种加密和编码方式:
- RC4加密(被魔改过)
- RSA加密(单字节加密)
- Base64编码(自定义码表)
(1) RC4加密分析
两个关键点:
- 密钥有伪装 - 不是声明时的初始值,在页面展示时会重新赋值
- 算法被魔改 - 包括S盒生成和加密操作
S盒生成魔改:
- 正常RC4的S盒生成中,交换前的计算部分
i和i3的位置互换了
加密计算魔改:
- 原本的异或(XOR)操作变成了加法(ADD)
自定义RC4解密代码示例:
def custom_rc4_decrypt(data, key):
# 实现魔改后的RC4解密逻辑
# 注意S盒生成和加密计算的修改
...
(2) RSA加密分析
- 单字节加密 - 对RC4加密结果逐个字节进行RSA加密
- 密钥是小整数,容易分析
- 题目中N=75067
- 使用factordb分解:75067=271*277
- 计算私钥进行解密
(3) Base64编码
- 使用自定义码表
- 需要从代码中提取实际的码表
四、ezAPP_And_SERVER部分详细解析
1. 服务器接口分析
- 直接访问会返回Error
- 真实路由隐藏在代码中
- 需要分析
common/Utils中的代码
2. 请求认证机制
请求需要两个关键Header:
Authorization- JWT令牌X-Sign- 签名
3. 加密字符串分析
- 代码中存在多个加密字符串
- 加密方式为简单的异或(XOR)
- 密钥在代码中可见
解密示例:
def xor_decrypt(ciphertext, key):
return bytes([c ^ key[i % len(key)] for i, c in enumerate(ciphertext)])
4. 接口发现
通过解密得到两个关键接口:
/api/v1/getflag- 获取flag的接口/api/v1/contacts?uid=- 查询联系人接口
5. JWT令牌生成
- 需要分析
Authorization参数的生成逻辑 - 是标准的JWT令牌
- 包含三部分:header、payload和signature
关键点:
- payload中的
uid是动态传入的 - 可以从
UserList文件中获取多个uid - 需要解密JWT的
Secret密钥
JWT生成代码示例:
import jwt
secret = "解密得到的密钥"
payload = {"uid": "admin的uid"}
token = jwt.encode(payload, secret, algorithm="HS256")
6. X-Sign生成逻辑
- 使用RSA2048加密
{"action":"getflag"}字符串 - 将加密结果作为
data字段的值 - 对整个JSON对象进行MD5哈希
- 哈希结果作为
X-Sign
关键点:
- RSA公钥可以从代码中的一大串数据获取
- 需要构造完整的请求:
- Header包含
Authorization和X-Sign - POST请求的body包含RSA加密后的
data
- Header包含
五、解题步骤总结
arkts部分:
- 解压HAP文件,获取
modules.abc - 使用
abcdecompiler反编译 - 分析
enc函数中的加密逻辑 - 实现魔改RC4解密
- 分解RSA的N,计算私钥解密
- 使用自定义Base64码表解码
ezAPP_And_SERVER部分:
- 解压HAP文件并反编译
- 解密所有加密字符串,发现隐藏接口
- 从
UserList获取uid列表 - 解密JWT的
Secret密钥 - 为每个
uid生成JWT令牌,尝试获取admin权限 - 分析RSA公钥,构造
X-Sign - 发送完整请求获取flag
六、工具准备
abcdecompiler- 反编译鸿蒙ABC文件- JWT调试工具 - 生成和验证JWT令牌
- RSA计算工具 - 分解N、计算私钥
- 编程环境(Python等) - 实现各种解密算法
七、注意事项
- 注意RC4算法的魔改部分
- 确保JWT的
uid尝试完整 X-Sign的生成步骤不能遗漏任何一步- 请求的Header和Body格式要完全正确