Hi 游客

更多精彩,请登录!

比特池塘 区块链茶馆 正文

详解以太坊君士坦丁堡升级后攻击合约

123458612
68 0 0
攻击代码:


0 deposit: 充值到被攻击的合约
1 updateSplit: 设定a, b的份额
2 splitFunds: 开始分账
3 a.transfer:按之前设定的份额,转账给a
4 b.transfer: 按之前设定的份额,转账给b
参照上面的流程图,被攻击的合约执行预期顺序是0、1、2、3、4。但如果a是恶意合约,那么执行顺序就变成了0、1、2、3、5、4.
可以看到恶意合约多执行了一个5,5又调用了1,也就是重新设置了a,b的份额,再执行4的时候b得到的eth就可以是100%。

5是怎么调用到1的呢,看代码
mstore(0x80, 0xc3b18fb600000000000000000000000000000000000000000000000000000000)
pop(call(10000, x, 0, 0x80, 0x44, 0, 0))
0xc3b18fb6 是 updateSplit(uint, uint)函数的签名,被暂存到0x80.
接下来就可以调用这个函数了。

那么又有问题了,这个攻击方法为什么在君士坦丁堡升级前无效,升级后有效呢?
原因是合约调用transfer的gas limit是2300,mstore在升级前需要至少5000gas, 升级后只需要200。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

123458612 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    7