详解以太坊君士坦丁堡升级后攻击合约
123458612
发表于 2022-12-19 22:12:39
85
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。
成为第一个吐槽的人