Ethernaut 题库闯关 #8 — Vault

Ethernaut题库闯关连载第8篇题解。

今天这篇是Ethernaut 题库闯关连载的第8篇,难度等级:中等。

Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。

Ethernaut挑战 #8:金库

本挑战的目标是能够猜出Vault的密码并解锁合约。

Vault 合约源代码如下:

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

contract Vault {
  bool public locked;
  bytes32 private password;

  constructor(bytes32 _password) public {
    locked = true;
    password = _password;
  }

  function unlock(bytes32 _password) public {
    if (password == _password) {
      locked = false;
    }
  }
}

在查看解题思路之前,可以自己先想一想,停一下,这样才有更大的提高。

研究合约

该合约相当简单和简短,我们有两个状态变量

  • bool public locked检查金库是否被锁定
  • bytes32 private password是我们需要猜测的解锁密码。

有一个constructor(bytes32 _password)函数,它将

  • locked变量设置为 true
  • password变量设置为输入参数_password的值。

之后,有一个unlock(bytes32 _password)函数,它只是检查byte32输入是否与存储的password值匹配,如匹配则解锁Vault

当你在区块链上使用或开发时,你必须记住的第一件事是,在区块链上,没有什么是真正私有的。即使你把一个变量声明为 privateinternal,一切都可以被看到。你通过阅读"SWC-136: Unencrypted Private Data On-Chain"来了解更多关于这个概念。

我这么说是因为合约的所有者会认为我不可能直接读取一个private的状态变量。但实际上,我们有两种不同的方式来做到这一点。

  1. 可以通过查看Etherscan或Tenderly上的部署数据来重新构建密钥
  2. 可以在部署后在一个区块后分叉网络,并使用[Foundry的作弊代码](https://book.getfoundry.sh/...

剩余50%的内容订阅专栏后可查看

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Ethernaut CTF
Ethernaut CTF
信奉 CODE IS LAW.