CTF-malleable
CTF-malleable
题目源代码:点击
题目要求是:
您一直在黑暗的森林中嗅探,并发现了 TreasureVault 合同。它需要合约所有者的验证签名才能提取选定数量的 ETH。
您已经记录了用户在之前的 tx 中用于提取一些 ETH 的签名。
耗尽剩余的合约资金。
首先先里了解一下签名,这是我有学到的一个新知识。
签名结构
v、r 和 s 是以太坊签名的三个组成部分。签名用于验证消息的来源和内容。
v 是恢复标识符,通常为 27 或 28,表示签名的版本。
r 和 s 是签名的输出,用于确保消息未被篡改。
签名的生成
签名包含三个部分:r、s 和 v。
r 和 s 是椭圆曲线的点,而 v 表示恢复标识符。
计算 s:
当生成签名时,消息哈希(通常是交易或信息的哈希)会被用于计算 r 和 s。
签名的 s 值通常会在 0 到曲线的参数 n 之间,因此在椭圆曲线中,s 值是可以被认为是模反的。
攻击者如何计算 s
模反性:
在椭圆曲线中,存在一个性质,允许将 s 值“反转”。具体来说,对于一个有效的 s,存在另一个有效的 s_,使得 s + s_ ≡ n(模 n),其中 n 是椭圆曲线的一个参数。
因此,攻击者可以通过计算:
𝑠=𝑛−𝑠
这里的 n 是 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141,这是 secp256k1 曲线的阶。
它是 secp256k1 曲线的阶(order)。在椭圆曲线密码学中,曲线的阶是指可以在该曲线上生成的点的数量。具体来说:曲线阶 n:ecp256k1 曲线的阶为 n =0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141,这是一个非常大的素数。这个值是由 secp256k1 标准定义的,适用于比特币和以太坊等区块链。
模运算的性质:
在使用这个曲线时,签名的 s 值通常会在 0 到 n-1 之间。如果 s 超过 n,则会被模运算处理。
由于签名可以用不同的 s 值表示同一条消息,因此攻击者可以通过计算 s_ = n - s 来生成一个有效的替代签名。
生成伪造签名:
攻击者将 s 替换为 s_,从而生成一个伪造的签名。此时,v 也可以根据需要调整,以确保签名的有效性。
伪造的签名仍然会通过合约的验证,因为它仍然与相同的消息哈希相对应(只是用不同的 s 值)。
为什么有效
当合约验证签名时,它只需要确认 r 和 s 是否对应于给定的消息(即哈希)。
由于 s_ 和 s 是通过模反得到的,它们仍然是有效的签名,合约将接受它,认为攻击者是有效的请求者。
所以我们只需要使用s_构造一个假签名就可以了。然后直接实现取款。
这是测试合约的一部分:
/// solves the challenge |