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
方法,就必须知道password
。password
是一个private
属性,private
属性表示外部合约不可见。但是由于区块链的完全公开性,我们可以通过password
的存储位置来读取对应的password
值
关于EVM
的 Storage 相关知识点可以参考这里: Ethereum Storage
攻击步骤
- 通过
storage
读取password
的值 - 调用合约的
unlock
方法
await web3.eth.getStorageAt(instance,1)
await contract.locked()