【CTF对抗- openzeppelin - fallback】此文章归类为:CTF对抗。
准备
环境的准备工作主要是在浏览器上安装一个MetaMask钱包,然后创建一个账户
这个系列的挑战还需要准备一些sepoliaETH,这个网上有不少教程,有的地方可以直接申请领一些,大概0.3左右,有些可能给的更多,不过因为众所周知的网络原因,以及有些网站为了避免滥用问题,要求主钱包里至少要有0.01ETH,这是要花钱买的,因此很多都用不了;第二个方法就是自己用算法挖一点,我就是这么做的,一晚上大概能出一个sepolia多一点,用来学习够用了
分析
需要在关卡里生成一个新的实例,然后按F12,就能在控制台看到你的实例地址,这个就是闯关需要用到的地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | pragma solidity ^0.8.0;
contract Fallback {
mapping(address => uint256) public contributions;
address public owner;
constructor() {
owner = msg.sender;
contributions[msg.sender] = 1000 * (1 ether);
}
modifier onlyOwner() {
require(msg.sender == owner, "caller is not the owner" );
_;
}
function contribute() public payable {
require(msg.value < 0.001 ether);
contributions[msg.sender] += msg.value;
if (contributions[msg.sender] > contributions[owner]) {
owner = msg.sender;
}
}
function getContribution() public view returns (uint256) {
return contributions[msg.sender];
}
function withdraw() public onlyOwner {
payable(owner).transfer(address( this ).balance);
}
receive() external payable {
require(msg.value > 0 && contributions[msg.sender] > 0);
owner = msg.sender;
}
}
|
代码部分内容不多,但是第一次接触Solidity还是会有点儿懵;直接看contribute函数,转账可以小于0.001 eth,然后贡献值随着你的转账变大而变大,当转账数值大于所有者的贡献值的时候,用户就会变成所有者;然后执行withdraw函数,则会将实例账户中的余额全都转到所有者账户中;综上所述,解决方案如下:
1、调用contribute函数,并发送一些ether
2、再次向实例地址发送一些ether,此时触发receive函数,同时满足了转账大于0和贡献大于0,成为所有者
3、调用withdraw函数,将合约地址中的ether转回到自己的钱包地址
解决
我这里使用remix IDE完成挑战,这个IDE我感觉还挺好用的
首先创建一个sol文件,将挑战页面给出的源代码copy到IDE中,左侧边栏中有一个Solidity编译器选项,点进去之后就可以编译了,需要注意的是,Solidity的版本需要和源码中的版本相同
编译完成后点击部署,环境选择 injected provider,此时如果你浏览器安装了MetaMask,则会弹窗提示连接,点击确定后就会连接到钱包,同时显示余额 ,此时将实例地址填写到 at address 栏中,然后点击按钮,就会出现这个关卡的挑战按钮
在以太币数量栏中输出1000000000000000 wei,然后点击contribute按钮,此时钱包会有交易提示,点击确认后,很快交易就会完成,钱包中会少一些ether,这些ether会转移到实例地址中,也可以点击getContribute按钮来查看自己的贡献率
然后在以太币数量栏中再次输入1000000000000000 wei,点击Transact按钮,和上面一样,钱包有交易提示,此时会触发receive函数,owner会变成自己
最后点击withdraw按钮,由于owner变成了自己,那么实例地址中的ether将全部都转回到自己的钱包地址中
此挑战完成
更多【CTF对抗- openzeppelin - fallback】相关视频教程:www.yxfzedu.com