1.情报收集
map_tracer

访问首页,看到一个地图展示页面。页面底部的 <script> 标签引用了 /app.js。


下载 app.js.map,恢复源代码

发现三个关键信息:
- 内部接口地址:/api/trace/internal/list
- 签名盐值:trace_dev_2026
- 签名算法:MD5(路径 + 时间戳 + 盐值)

测试接口行为
|
|

构造合法请求
|
|

base64解码
|
|

2.密码破解
2.1Double_sign
|
|
连接服务器,查看数据
|
|
服务器返回:
|
|
然后提示输入 r 和 s
识别漏洞
|
|
恢复随机数 k
|
|
对 msg1 和 msg2 分别有:
|
|
两式相减,消去 r·d:
|
|
|
|
恢复私钥 d:
|
|
伪造 admin 签名
用私钥 d 为 "role=admin&action=read_flag" 生成合法签名:
|
|
提交签名,获取 flag
|
|
exp:
|
|
2.2Seed_receipt
receipts.txt
|
|
generator.py
|
|
-
识别漏洞:
random.seed(ts ^ order_id)在build_check_code和obfuscate中被重复调用,种子完全相同。Python 的random模块是确定性的,相同种子产出相同序列。 -
恢复种子:
ts和order_id已知,直接计算出ts ^ order_id。 -
重放 RNG 状态:用相同种子播种,跳过前 6 次
randint(0,9)调用(即生成build_check_code的那部分),此时 RNG 状态恰好与obfuscate中生成 XOR mask 时同步。 -
生成 mask 并解密:用同步后的 RNG 生成 XOR mask,与 cipher 异或得到明文。
exp:
|
|
2.3faulty_stamp
output.txt(已知)
|
|
task.py
|
|
- 理解 RSA-CRT 原理:签名拆分为模
p和模q两部分:
- s_p = m^dp mod p
- s_q = m^dq mod q
- 通过 CRT 重组:s = s_q + q_inv * (s_p - s_q) * q
- 定位故障影响:
inject_fault=True时,只篡改了sq(加 1),sp完全正确。所以:
- 模 p 部分正确:s_fault ≡ s_good (mod p)
- 模 q 部分错误:s_fault ≠ s_good (mod q)
- GCD 分解:由于
s_fault ≡ s_good (mod p),即p | (s_fault - s_good),而p也是n的因子:
|
|
- 解密 cipher:有了
p和q,计算φ(n) = (p-1)(q-1),进而得到d = e⁻¹ mod φ(n),最后解密。
exp:
|
|