Fountain代币合约源码:
https://etherscan.io/address/0x82cf44be0768a3600c4bdea58607783a3a7c51ae#code
本次攻击主要利用了合约中的batchTransfers函数,攻击交易地址:
https://etherscan.io/tx/0x6898846b762aefcdb99d077212bed5e02fd40187dfe21f1070ec8f96b4a7e0da
先来看看主要的batchTransfers函数:
该函数是用于分别给不同的地址转账,具体流程如下:
计算总共要转的金额(存在溢出
转账人的余额减去要转的总金额
收款人增加单笔转账的金额
问题主要发生在第一步,由于存储总金额的变量totalAmount的类型为uint256,uint256的最大值为2的256次方,当要赋予totalAmount的值超过2^256的话就会发生上溢。
出了batchTransfers函数之外我们还发现了该合约还有多处函数存在类似的溢出问题:
batchTransferFroms
function batchInvests (只允许owner调用
首先攻击者使用溢出给自己凭空铸造了大量的代币
但是他并无法卖出这么多
该地址总共向外转出了7502160个代币。
然后我们发现该代币总共就上线了两个交易所:CoinBene、Cointiger
经过调研发现攻击者主要在Cointiger交易所将币卖出
时间和攻击者对合约完成攻击的时间差不多吻合
如果将这个时间段内的卖单全部算为攻击者的卖单,那么攻击者本次总共卖出的代币数量为12595,获利金额为0.07 BTC。