第二届CCF智能汽车攻防赛遴选赛WP

Digital Key UWB

前置知识

ECDSA 所有的数学基础都建立在椭圆曲线的点运算上。其核心方程可以简单表示为:
$$
Q = d \cdot G
$$
d是私钥,G是基点,这是椭圆曲线上公开的点(x_1, y_1)(已知的,有时为了防AI不告诉你是什么,而是给你提示让你自己找),Q是公钥

签名过程

假设发送方(Alice)要对消息 M 进行签名:

  1. 哈希: 计算消息的哈希值 e = Hash(M)。

  2. 生成随机数: 选择一个随机整数 k。

  3. 计算曲线点: 计算点 (x_1, y_1) = k * G。

  4. 计算 r: 取 r = x_1 mod n(n是基点G的阶)。如果 r=0,重新选 k。

  5. 计算 s: 计算 s = k^{-1}(e + d * r) mod (n)。如果 s=0,重新选 k。

  6. 输出签名: 最终的数字签名就是这一对值:(r, s)。

验签过程

接收方(Bob)收到消息 M 和签名 (r, s),并持有 Alice 的公钥 Q:

  1. 验证有效性: 检查 r 和 s 是否在 1 到 n-1 的范围内。
  2. 哈希: 计算消息的哈希值 e = Hash(M)。
  3. 计算逆元: 计算 w = s^{-1} mod(n)
  4. 计算参数: u_1 = e * w mod(n) u_2 = r * w mod(n)
  5. 计算曲线点: 计算点 (x_2, y_2) = u_1 * G + u_2 * Q。
  6. 判定: 如果 x_2 mod(n) == r,则验签成功,说明消息确实由 Alice 签名且未被篡改。

核心参数详细数值

两条主流椭圆曲线的核心参数对照表

1. Secp256k1

  • p (素数域): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
  • b(系数): 0x0000000000000000000000000000000000000000000000000000000000000007
  • G (基点)
    • X: 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
    • Y: 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
  • n (阶): 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

2. Secp256r1 (NIST P-256)

  • p (素数域): 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF
  • b (系数): 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B
  • G (基点)
    • X: 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296
    • Y: 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5
  • n(阶): 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551

解题思路

附件是个sqlite数据库文件,在auth signatures表里发现两条ECDSA签名,两条签名的r一样,就是多个明文在加密过程中,调用了同一个k导致出现的漏洞

在protected vehicle blob中发现加密的取证结果

image-20260805111334573

根据提示先恢复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

image-20260805111517794

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后面有个长度字节,要删去,否则结果会误码

image-20260805122130318

flag

flag{tbox_firmware_basic_reverse}

TSP

解题思路

日志里啥都给了,一把梭

image-20260805122733393

flag

flag{tsp_sm4_diag_log_simple}
posted @ 2026-08-05 13:25  sprYAaaa  阅读(51)  评论(0)    收藏  举报