第二届CCF智能汽车攻防赛遴选赛WP
Digital Key UWB
前置知识
ECDSA 所有的数学基础都建立在椭圆曲线的点运算上。其核心方程可以简单表示为:
$$
Q = d \cdot G
$$
d是私钥,G是基点,这是椭圆曲线上公开的点(x_1, y_1)(已知的,有时为了防AI不告诉你是什么,而是给你提示让你自己找),Q是公钥
签名过程
假设发送方(Alice)要对消息 M 进行签名:
-
哈希: 计算消息的哈希值 e = Hash(M)。
-
生成随机数: 选择一个随机整数 k。
-
计算曲线点: 计算点 (x_1, y_1) = k * G。
-
计算 r: 取 r = x_1 mod n(n是基点G的阶)。如果 r=0,重新选 k。
-
计算 s: 计算 s = k^{-1}(e + d * r) mod (n)。如果 s=0,重新选 k。
-
输出签名: 最终的数字签名就是这一对值:(r, s)。
验签过程
接收方(Bob)收到消息 M 和签名 (r, s),并持有 Alice 的公钥 Q:
- 验证有效性: 检查 r 和 s 是否在 1 到 n-1 的范围内。
- 哈希: 计算消息的哈希值 e = Hash(M)。
- 计算逆元: 计算 w = s^{-1} mod(n)
- 计算参数: u_1 = e * w mod(n) u_2 = r * w mod(n)
- 计算曲线点: 计算点 (x_2, y_2) = u_1 * G + u_2 * Q。
- 判定: 如果 x_2 mod(n) == r,则验签成功,说明消息确实由 Alice 签名且未被篡改。
核心参数详细数值
两条主流椭圆曲线的核心参数对照表
1. Secp256k1
- p (素数域):
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F - b(系数):
0x0000000000000000000000000000000000000000000000000000000000000007 - G (基点)
- X:
0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 - Y:
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
- X:
- n (阶):
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
2. Secp256r1 (NIST P-256)
- p (素数域):
0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF - b (系数):
0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B - G (基点)
- X:
0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 - Y:
0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5
- X:
- n(阶):
0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551
解题思路
附件是个sqlite数据库文件,在auth signatures表里发现两条ECDSA签名,两条签名的r一样,就是多个明文在加密过程中,调用了同一个k导致出现的漏洞
在protected vehicle blob中发现加密的取证结果

根据提示先恢复ESDSA的私钥
关键步骤:
k = (e1 - e2) / (s1 - s2) mod(n)
d = (s1 * k - e1) / r mod(n)
脚本如下:
from hashlib import sha256
r = 0x67d6db4e0744fe60746c510d6938e64f4a893e64e06b90c2030d1b981ec17d5e
s1 = 0x610a011f7503af143a99eef6a90668cd2572872ae6c5644b9d7edda3cb3d989e
s2 = 0xd0b34225e983269a67d787ee754c3ecf1f79c62af4e5ee3c1b971584c131d3b1
e1 = int("d11ef13079938077b29ad9ce9f8c8a6963bb75a5aba1f738a228c7a7dc48f2e7", 16)
e2 = int("ebb1a7e2ce5351ca8bc71464cce8679034d4b22e86c65e5d507d20b75c6c6ac8", 16)
# 曲线的阶 n(以 Secp256k1 曲线为例,如果给了其他的改了就行)
# n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
# 曲线的阶 n(以 Secp256r1 曲线为例,如果给了其他的改了就行)
n=0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551
k = ((e1 - e2) * pow(s1 - s2, -1, n)) % n
d = ((s1 * k - e1) * pow(r, -1, n)) % n
pri_key=sha256(d.to_bytes(32, 'big')).digest()[:16].hex()
print(f"pri_key: {pri_key}")
得到私钥
e038de51cc70112dc55ed0d2bd01cd4
用该 SM4 key 和数据库中的 IV 解密 protected_vehicle_blob.ciphertext_b64

flag
flag{digital_key_uwb_nonce_reuse}
远程诊断配置
解题思路
strings发现提示
DPhantomDrive T-Box firmware 1.0
VIN=LCTF2026INTRO001
UDS DID F190 = VIN
UDS request 22 EF 01 returns 7F 22 33 online; recover EF01 offline from NVM
NVM file marker: EF01DATA
EF01 payload codec: XOR with DIAG_KEY
DIAG_KEY=TBOX2026
This is an intro firmware recovery challenge.
在nvm中找到marker,后面的是payload,与DIAG_KEY异或即可,注意marker后面有个长度字节,要删去,否则结果会误码

flag
flag{tbox_firmware_basic_reverse}
TSP
解题思路
日志里啥都给了,一把梭

flag
flag{tsp_sm4_diag_log_simple}

浙公网安备 33010602011771号