OpenHarmony CTF arkts+ezAPP_And_SERVER
字数 1932 2025-08-30 06:50:12

OpenHarmony CTF arkts+ezAPP_And_SERVER 详细解析

一、题目概述

这是一个关于鸿蒙(HarmonyOS)应用程序分析的CTF题目,包含两部分内容:

  1. arkts部分 - 分析鸿蒙hap文件中的加密逻辑
  2. 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函数使用了多种加密和编码方式:

  1. RC4加密(被魔改过)
  2. RSA加密(单字节加密)
  3. Base64编码(自定义码表)

(1) RC4加密分析

两个关键点:

  1. 密钥有伪装 - 不是声明时的初始值,在页面展示时会重新赋值
  2. 算法被魔改 - 包括S盒生成和加密操作

S盒生成魔改:

  • 正常RC4的S盒生成中,交换前的计算部分ii3的位置互换了

加密计算魔改:

  • 原本的异或(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:

  1. Authorization - JWT令牌
  2. X-Sign - 签名

3. 加密字符串分析

  • 代码中存在多个加密字符串
  • 加密方式为简单的异或(XOR)
  • 密钥在代码中可见

解密示例:

def xor_decrypt(ciphertext, key):
    return bytes([c ^ key[i % len(key)] for i, c in enumerate(ciphertext)])

4. 接口发现

通过解密得到两个关键接口:

  1. /api/v1/getflag - 获取flag的接口
  2. /api/v1/contacts?uid= - 查询联系人接口

5. JWT令牌生成

  • 需要分析Authorization参数的生成逻辑
  • 是标准的JWT令牌
  • 包含三部分:header、payload和signature

关键点:

  1. payload中的uid是动态传入的
  2. 可以从UserList文件中获取多个uid
  3. 需要解密JWT的Secret密钥

JWT生成代码示例:

import jwt

secret = "解密得到的密钥"
payload = {"uid": "admin的uid"}
token = jwt.encode(payload, secret, algorithm="HS256")

6. X-Sign生成逻辑

  1. 使用RSA2048加密{"action":"getflag"}字符串
  2. 将加密结果作为data字段的值
  3. 对整个JSON对象进行MD5哈希
  4. 哈希结果作为X-Sign

关键点:

  • RSA公钥可以从代码中的一大串数据获取
  • 需要构造完整的请求:
    • Header包含AuthorizationX-Sign
    • POST请求的body包含RSA加密后的data

五、解题步骤总结

arkts部分:

  1. 解压HAP文件,获取modules.abc
  2. 使用abcdecompiler反编译
  3. 分析enc函数中的加密逻辑
  4. 实现魔改RC4解密
  5. 分解RSA的N,计算私钥解密
  6. 使用自定义Base64码表解码

ezAPP_And_SERVER部分:

  1. 解压HAP文件并反编译
  2. 解密所有加密字符串,发现隐藏接口
  3. UserList获取uid列表
  4. 解密JWT的Secret密钥
  5. 为每个uid生成JWT令牌,尝试获取admin权限
  6. 分析RSA公钥,构造X-Sign
  7. 发送完整请求获取flag

六、工具准备

  1. abcdecompiler - 反编译鸿蒙ABC文件
  2. JWT调试工具 - 生成和验证JWT令牌
  3. RSA计算工具 - 分解N、计算私钥
  4. 编程环境(Python等) - 实现各种解密算法

七、注意事项

  1. 注意RC4算法的魔改部分
  2. 确保JWT的uid尝试完整
  3. X-Sign的生成步骤不能遗漏任何一步
  4. 请求的Header和Body格式要完全正确
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解密代码示例: (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) 密钥在代码中可见 解密示例: 4. 接口发现 通过解密得到两个关键接口: /api/v1/getflag - 获取flag的接口 /api/v1/contacts?uid= - 查询联系人接口 5. JWT令牌生成 需要分析 Authorization 参数的生成逻辑 是标准的JWT令牌 包含三部分:header、payload和signature 关键点: payload中的 uid 是动态传入的 可以从 UserList 文件中获取多个 uid 需要解密JWT的 Secret 密钥 JWT生成代码示例: 6. X-Sign生成逻辑 使用RSA2048加密 {"action":"getflag"} 字符串 将加密结果作为 data 字段的值 对整个JSON对象进行MD5哈希 哈希结果作为 X-Sign 关键点: RSA公钥可以从代码中的一大串数据获取 需要构造完整的请求: Header包含 Authorization 和 X-Sign POST请求的body包含RSA加密后的 data 五、解题步骤总结 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格式要完全正确