00
一些前言
嗯嗯,公众号距离上次发文章已经过去了一个月啦。上次我是这么说的 =。=:
结果一方面是到了季度末公司特别忙,另一方面行情确实在不断锤人,一慵懒一个月就过去了。
一直觉得熊市是最好的播种时机,不管是加强自己的学习,还是浏览新的项目。因为牛市里,不断新高的币价总比枯燥的白皮书和代码好看,而潮水退去大家都开始裸泳的时候,能摘两片叶子遮遮那自然是更好的。
比较巧的是,这个时候发现了老董的区块链课程第三期开始招生。出于熊市里百无聊赖的好奇,我就报名参加啦。
01
一些见闻
之前抖机灵自己浏览过以太坊的开发文档,solidity, web3多多少少懂些皮毛,也写过几个非常简单的只能合约。所以对课程的前半部分关于以太坊简介和solidity语法的内容,大都水水过。后半部分开始用truffle脚手架做以太坊后端开发,前端用npm+react做交互,再通过infura的API将合约部署到主网和测试网,还是充满趣味,比我自己之前手动从remix上部署要规范了许多。总体来说对于熟悉区块链或者前端基础较好的人来说,是比较轻松有趣的课程。
课程的重点在最后的白帽黑客大赛,15个组野蛮攻防,直接从easy模式跳到了地狱模式,着实玩嗨了起来。也对以太坊的安全性有了新的认识。
由于之前写作业都是单机模式,每次水水过也没太在意大家的表现。我曾经猖狂得说,不是我谦虚,区块链开发我超过世界上90%的码农。一到比赛发现,似乎那10%都来到这里?好在我们小组也是给力到哭,组长逸飞分分钟盲扫出各个漏洞,秋百万分分钟代码实现无懈可击。大腿又粗又壮,我们最终拿下了老董区块链开课以来最高分数和最最最强称号。
核心合约的构造函数花式调用一个initializeVault函数,然而不作就不会死,这个函数的定义写成了initilizeVault(少了一个a),然后这个通过address.call的调用没有检查返回值,所以核心合约是没有初始化的。
更作死的是,initilizeVault函数没有访问的限制,所以我们很早就默默得拿到了几乎所有组合约的ownership(只要知道其他组合约地址,就能通过MEW+ABI或者直接web3+json inputData调用这个函数)然后我们在比赛进行了一个半的时候,默默的调用自毁函数杀掉了一半的参赛组,成功引起了第一波恐慌。。。
然而遗憾是,我们虽然抢到了绝大多数组合约的所有权,却没抢下合约共享库的所有权。共享库的控制着如果杀掉了库,所有组也就gg。去年的第二次Parity钱包就是因为黑客把库自毁了,结果通过地址寻址共享库的钱包们都变向挂彩。为了不让这名黑客得逞,我们不得不不断得向共享库充钱续命。充钱充得肉痛了,我们便开始想破解另外一个充钱合约。破解了这个合约就可以无限充钱。然而,这个合约是非开源的。。。于是在秋百万的帮助下,他和我开始手怼汇编破解magic number。最后在读汇编差不多出结果的时候发现别人组有人先破解出来了。于是小小得做个弊,通过在区块链上查交易数据拿到了magic number然后顺利拿下了充钱合约。至此共享库的威胁彻底消除了。
比赛故意设计的最明显的漏洞,估计就是那个取钱时的reentry attack。因为在取钱时需要先调用一个外部合约的observe方法,通过在外部合约observe里做手脚,可以再次回到这个取钱函数从而多次取钱。DAO事件的原型就是这个重入攻击。更有趣的地方在于,我们已经破解了充值合约,所以我们可以先往这个合约里充很多钱,再来慢慢reentry attack把钱取出来。攻击合约不难设计,只需要发布一个合约,observe里调用回这个被攻击合约的取钱函数即可。难点在于试栈的深度,以免递归过多次导致整个交易被回滚从而攻击失败。
当我们在准备如何重入套出最大数量的币时,中本聪转世逸飞同学又发现了自杀的转账是无法用modifer限制的。有了这个惊天发现,我们可以通过自爆合约把钱充值到我们控制的其他组合约里去,然后再杀掉他们合约拿出他们的钱。
于是这个黑客游戏后来变成了我们刷水管的游戏。秋百万童鞋改进我的刷币脚本,变成了疯狂的多线程版本,我们几小时内刷了7000币,直接把metamask.io的facuet刷爆了好几次。。。最后老董也看不下去了,比赛提前结束。。。
02
一些感想
以太坊的solidity真的是一门及其原始的编程语言。很多安全性漏洞,其实可以从语言层面上加以预防。从这个角度我无限期待EOS的c++变成。梳理并操作一遍所有已知漏洞的过程是有趣且收益良多的。定下目标今年要写个大型智能合约,现在底气会更足些了。
另外在这里认识的小伙伴都很赞,的确是国内热爱区块链开发的一群人了,答疑和分享都是我所见过极高质量的。比如一直以为是职业段子手的助教李老师(使劲黑=。=人家其实是我直系学长,浙大竺院04届) 分享了我至今以来见过最详细也最透彻的POS共识详解。
憋问我为什么这么卖力得夸别人,因为我被别人夸得也很开心呀哈。真是多一些相互夸奖,人间充满爱哈哈哈哈
你说什么都对,可是说好的比特币价值分析呢?
领取专属 10元无门槛券
私享最新 技术干货