blockchain入门

准备

工具

  1. MetaMask(区块链钱包)

  2. etherscan(区块链浏览器)

  3. remix(智能合约IDE)

  4. Online Solidity Decompiler(在线智能合约反编译器)

    https://ethervm.io/decompile?address=0xabcd&network=ropsten

    address:合约地址,network:网络

  5. VANITY-ETH (可以枚举生成带有指定前缀或后缀的账户)

靶场

  1. chainflag (国内师傅做的)
  2. Ethernaut

水龙头(获取 test ether)

  1. metamask faucet (MetaMask里点购买往下拉,不是很稳定)
  2. chainflag faucet(稳定,一天一个)

入门(Greeter)

接下来使用chainflag的签到题Greeter来作为入门

nc上去查看合约源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pragma solidity 0.8.7;

contract Greeter {
string greeting;

constructor(string memory _greeting) public {
greeting = _greeting;
}

function greet() public view returns (string memory) {
return greeting;
}

function setGreeting(string memory _greeting) public {
greeting = _greeting;
}

function isSolved() public view returns (bool) {
string memory expected = "HelloChainFlag";
return keccak256(abi.encodePacked(expected)) == keccak256(abi.encodePacked(greeting));
}
}

思路

我们的目标是成功执行isSolved函数并返回true

我们需要expectedgreeting相同,expected是已知的

所以,我们使用setGreeting函数来设置greetingexpected一致

操作

打开remix,新建一个sol文件,把源码写到sol文件里,可根据需要调整代码(保证不报错,包含后面要用到的函数或变量就行)

image.png

按ctrl+s编译,或者也可以在编译栏点击编译(还可以选择编译器版本)

image.png

在这题中,我们需要nc上去创建一个账户并转账使其满足题目条件(转0.001 test ether),记得保存地址和token,这个账户接下来会用于部署合约,而部署合约所花费的gas从我们刚刚的转账里扣,转账功能为在MetaMask里的发送

image.png

等待交易完成,如图中显示绿色表示完成,再nc上去用之前的token部署合约,得到一个合约地址和一个交易hash值

回到remix,选择最后一栏(DEPLOY & RUN),把ENVIRONMENT调成Inject Web3连接MetaMask,在At Address填入目标合约地址,再点击At Address与合约交互

image.png

接下来按照之前的思路操作(有颜色的是按钮,点击调用函数或获取变量值)

image.png

最后nc上去输入token获取flag