Skip to main content

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;
}
}
}

题目要求

这道题目要求成功调用unlock方法,解锁locked

题目分析

想要成功调用unlocked方法,就必须知道passwordpassword是一个private属性,private属性表示外部合约不可见。但是由于区块链的完全公开性,我们可以通过password的存储位置来读取对应的password

关于EVM的 Storage 相关知识点可以参考这里: Ethereum Storage

攻击步骤

  1. 通过storage读取password的值
  2. 调用合约的unlock方法
await web3.eth.getStorageAt(instance,1)
await contract.locked()