前言

香港AI x Cybersecurity Challenge(人工智能網絡安全挑戰賽)是由数字政策办公室、香港网络安全专业协会(CSPA)、中国网络空间研究院、中国移动香港有限公司主办的新兴网络安全赛事。比赛采用动态计分机制——先完成解题的队伍获得更高分数。初赛为12小时线上Jeopardy-style解题赛,决赛为香港线下一日赛,结合AI攻防与现实情境挑战。

不同于传统CTF,本次比赛要求参赛队伍设计、构建和运行AI驱动的自动化系统,自动分析靶场环境、识别并利用漏洞。题型覆盖程序漏洞、密码学、AI网络安全、电脑鉴证、逆向工程、网站漏洞等。

笔者队伍在初赛中成功晋级线下,笔者负责逆向与二进制分析部分且已全解。以下是各方向的完整解题思路。

一、Reverse(逆向工程)

1.1 SimpleSocket —— 混合加密与数据包重排

题目背景:“A lightweight client-server program protects its returned message through a custom communication flow. Reverse the logic behind the exchange and recover the final content.”

解压附件后得到4个文件:

text

SimpleSocket.zip
├── py          # Python源码(1540字节)
├── packet1     # 数据包1(96字节)
├── packet2     # 数据包2(900字节)
└── packet3     # 数据包3(256字节)

Step 1:源码分析

打开py文件,发现典型的RSA + AES混合加密体系

python

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP, AES
from Crypto.Util.Padding import pad, unpad

服务端生成1024位RSA密钥对:

python

def generate_rsa_keys():
    key = RSA.generate(1024)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    return private_key, public_key

客户端逻辑:生成16字节AES密钥,用RSA公钥加密后发送给服务端:

python

def client_logic(public_key):
    aes_key = os.urandom(16)
    cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
    encrypted_aes_key = cipher_rsa.encrypt(aes_key)

服务端用RSA私钥解密获得AES密钥,后续通信全部使用AES加密。

Step 2:数据包分析

  • packet1(96字节)= RSA加密的AES密钥

  • packet2(900字节)= AES加密的密文数据

  • packet3(256字节)= 另一段AES密文

关键发现:数据包顺序存在错位。正常流程中,客户端先发RSA加密的AES密钥,服务端回复AES加密数据。但抓包数据中packet2和packet3的顺序被调换了。

Step 3:解密流程

  1. py源码中提取RSA私钥(源码中硬编码了测试用的私钥)

  2. 用私钥解密packet1,获得AES密钥

  3. 正确顺序(packet2 → packet3)拼接AES密文

  4. 用AES密钥解密密文,去除padding后获得flag

python

# 核心解密逻辑伪代码
rsa_key = RSA.import_key(private_key_pem)
cipher_rsa = PKCS1_OAEP.new(rsa_key)
aes_key = cipher_rsa.decrypt(packet1)

cipher_aes = AES.new(aes_key, AES.MODE_ECB)
plaintext = unpad(cipher_aes.decrypt(packet2 + packet3), AES.block_size)
# flag = HKAI{...}

关键技巧:CTF中混合加密题目的突破口往往在于提取硬编码密钥识别数据包结构,而非暴力破解。

1.2 CodeSign —— Android APK签名证书逆向

题目类型:Android APK逆向,涉及APK签名机制。

Step 1:初探APK

将APK解包后,发现关键逻辑:程序使用APK签名证书的SHA1指纹作为XOR密钥对flag进行加密。

Step 2:APK签名结构解析

Android APK V2签名(APK Signature Scheme v2)将签名信息存储在APK文件的签名块(Signing Block)中。需要从APK中提取v2签名证书:

text

APK文件结构:
[ZIP Central Directory] ← 文件末尾
[APK Signing Block]    ← V2/V3签名存储位置
[ZIP Entries]

Step 3:提取证书并计算SHA1

使用apksigner或自行解析签名块结构,提取X.509证书,计算其SHA1指纹:

bash

# 方法1:使用keytool
keytool -printcert -jarfile app.apk

# 方法2:使用apksigner
apksigner verify --print-cert app.apk

Step 4:XOR解密

将SHA1指纹作为XOR密钥,对加密数据进行异或解密:

python

import hashlib
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.serialization import Encoding

# 提取证书 → 计算SHA1
cert_der = extract_cert_from_apk("app.apk")
sha1 = hashlib.sha1(cert_der).digest()

# XOR解密
encrypted = bytes.fromhex("...")
key = sha1
flag = bytes([encrypted[i] ^ key[i % len(key)] for i in range(len(encrypted))])

知识点延伸:APK签名证书的SHA1指纹在正常应用中用于校验应用完整性,但在CTF中常被用作隐藏的密钥材料。这种设计思路在实际恶意软件分析中也很常见——攻击者会用合法证书的哈希作为解密密钥以绕过检测。

二、Crypto(密码学)

初赛Crypto题目围绕RSA低指数攻击LCG随机数预测展开。

2.1 RSA LCG —— 当RSA遇上线性同余生成器

题目特征:服务端使用LCG生成RSA密钥对中的素数,导致素数之间存在线性关系,从而可以被分解。

核心原理

LCG定义为:X_{n+1} = (a * X_n + c) mod m

如果RSA模数N = p * q中的pq由同一个LCG生成(或存在已知线性关系),则可构造方程求解。

解题思路

  1. 收集多组LCG输出值(通常服务端会提供多次交互的密文)

  2. 利用LCG的线性关系恢复参数acm

  3. 预测素数pq,分解N

  4. 计算私钥d,解密密文

python

# LCG参数恢复(已知连续输出x0, x1, x2)
# x1 = (a*x0 + c) mod m
# x2 = (a*x1 + c) mod m
# → a = (x2 - x1) * inv(x1 - x0, m) mod m

2.2 通用Crypto解题框架

在CTF中应对密码学题目,建议遵循以下流程:

  1. 识别算法:从题目描述或源码中判断使用的加密算法(RSA、AES、ECC、LCG等)

  2. 提取参数:获取模数、指数、密文、已知明文等

  3. 识别漏洞:判断是否存在低指数、共模攻击、选择密文攻击、填充预言等漏洞

  4. 编写利用脚本:使用PyCryptodome、gmpy2、SageMath等工具

三、Misc(杂项)

Misc题型在本次比赛中主要涉及隐写术流量分析数据恢复

3.1 图片隐写 —— 藏在像素里的秘密

常用工具链

工具 用途
StegSolve 检测LSB隐写、不同颜色通道的隐藏信息
Zsteg 命令行检测PNG/BMP的LSB隐写
binwalk 检测文件中嵌入的其他文件
foremost 文件 carving 恢复

解题流程

  1. 先用file命令确认文件类型

  2. binwalk检查是否有嵌入文件

  3. StegSolve逐通道检查像素异常

  4. 若发现LSB隐写,用zsteg -a提取

3.2 流量分析 —— 在数据包中寻找Flag

Wireshark是流量分析的核心工具:

  1. 筛选HTTP请求:http.request 或 http contains "flag"

  2. 筛选TCP流:右键 → Follow TCP Stream

  3. 导出对象:File → Export Objects → HTTP

  4. 检查DNS查询中的异常子域名(可能为DGA或数据外泄)

3.3 压缩包破解

当遇到加密的ZIP/RAR文件时:

  1. 优先尝试弱口令或题目中隐含的提示

  2. 使用fcrackzipJohn the Ripper进行字典攻击

  3. 若为ZIP伪加密,修改加密标志位即可绕过

四、参赛心得与技巧总结

4.1 动态计分机制下的策略

本次比赛采用动态计分,意味着速度至关重要。建议:

  • 先易后难:优先解决Misc和简单Crypto快速积累分数

  • 并行作战:队内分工,同时推进多个方向的题目

  • 脚本复用:提前准备好常用解题脚本(XOR、RSA、AES等)

4.2 AI在CTF中的角色

本次比赛的一大特色是AI驱动攻防。参赛队伍需要构建AI自动化系统分析靶场、识别漏洞。实际比赛中,AI辅助主要体现在:

  • 自动化信息收集:扫描端口、识别服务版本

  • 漏洞模式匹配:将靶场特征与已知CVE或漏洞模式匹配

  • 脚本生成:根据漏洞类型自动生成利用脚本

4.3 通用解题方法论

无论哪个方向,CTF解题都可归纳为四步:

  1. 信息收集:识别题目类型、提取附件中的关键信息

  2. 漏洞定位:找到可被利用的弱点

  3. 利用实现:编写脚本或手工操作获得flag

  4. Flag提取:注意flag格式(通常为HKAI{...}flag{...}

结语

香港AI x Cybersecurity Challenge 2026是一次融合AI与网络安全的创新赛事。初赛12小时的Jeopardy-style解题赛覆盖了Reverse、Crypto、Misc、Web、Pwn等多个方向,决赛则进一步考验AI攻防实战能力。

对于参赛者而言,系统化的方法论比零散的技巧更重要——信息收集→漏洞定位→利用实现→Flag提取的闭环思维,配合跨模块的联动能力,才是高效解题的关键。

笔者队伍已成功晋级线下决赛,后续将继续分享决赛阶段的AI攻防实战经验。欢迎关注交流!

本文基于香港AI x Cybersecurity Challenge 2026初赛实战经历整理。相关Writeup参考了gm7.org的技术文章及CTFtime赛事页面。

更多推荐