相关知识
环境和工具
开发环境:Chrome Remix MetaMask
在Chrome浏览器中就能进行以太坊智能合约的开发工作,因为Solidity语言有一个在线IDE——Remix
remix IDE网站: https://remix.ethereum.org/
Remix是一个使用JavaScript编写的IDE,能把用户编写的Solidity语言编译成字节码,然后通过Chrome的MetaMask插件,使用插件中存储的以太坊账号向公网的以太坊区块链网络发送交易达到部署智能合约、调用智能合约的效果。MetaMask也提供了创建以太坊个人账号的功能。如果当前网络设置的是测试网络,那么MetaMask会为用户提供一个链接,让用户免费获取到以太币。
Python的Web3库
CTF中的智能合约题目很少有能够手动完成的,大部分需要参赛者编写利用脚本。最方便的是使用JavaScript来写脚本,因为JavaScript有专门的Web3库,封装了调用RPC功能的函数。Python3也有专门的Web3库,,喜欢使用Python的读者也可以使用Python3编写脚本,安装命令如下:
pip3 install web3
【例题】0xGame 肘,上链!(复现)
nc连一下题目,告诉我们这题的主线就是要使得isSolved这个函数返回True值
我们先创建一个 deployer account(部署者账户)
然后要去水龙头(faucet 处给这个账户接点水,以支付部署合约时所需要的费用
点击4查看一下合约的源代码
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
contract Signin {
bytes32 signin;
constructor () {}
function sign(bytes32 _signin) public {
signin = _signin;
}
function isSolved() public view returns (bool) {
string memory expected = "Hello0xBlockchain";
return keccak256(abi.encodePacked(expected)) == signin;
}
}
这里源码的意思是要求传的值需要与”Hello0xBlockchain”的keccak256哈希值相同
写个py脚本跑一下就可以,注意:传值时一定要加上0x
填一下RPC URL
切换到该网络,在自己的账户上也去水龙头上接一下水
然后打开remix,一个部署智能合约的在线网站
将合约源码复制进去,并进行编译,当看到绿色的勾勾时说明编译成功
再点击第四个按钮,将ENVIRONMENT改为Injected Provider - MetaMask
然后在ACCOUNT上选择自己的mask账户,这里要注意要将remix与mask建立连接
再填写contract address(合约地址)
这里将前面分析源码写出的脚本结果输入并点击sign即可,然后再点击isSolved如果返回值为true,则说明成功进行交易,就可以拿到flag
总结:
区块链有几个参数是缺一不可的,如deployer account&contract address&ACCOUNT(自己的钱包),一定要分辨清楚,不要搞错了……
题目主要考察对源码的分析理解,以及会编写相应的脚本即可,以后希望能继续熟悉区块链的各种操作