抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

1.题目要求

  • 1.1 要求 :打开 vault 来通过这一关!

  • 题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Vault {
bool public locked;
bytes32 private password;

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

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

2. 分析

  • 2.1 在区块链上使用或开发时,首先要记住的是,区块链中没有任何东西是私有的。即使您将变量声明为private或 ,也可以看到所有内容internal

  • 2.2 状态变量存储在合约存储中,因为变量password是一个 32 字节的数据,它总是会填满整个槽,使得它在合约的第二个槽中的位置非常可预测,因为第二个状态变量定义。

    在这种情况下,我们可以很容易地使用web3.pygetstorageat()上的功能,通过在第二个存储槽中查找来查看密码是什么。然后我们可以选择将其转换为文本以查看密码是什么。

  • 2.3 在浏览器控制台上执行 * await web3.eth.getStorageAt(contract.address,1) * 命令 获取password

  • 然后在 关卡实例部署的合约上输入获取到的 password

3. 解题

  • 3.1 获取关卡实例地址:0x3741430AB42C816Dbbe583001C9615049ad09e31

  • 3.2 执行 *await web3.eth.getStorageAt(contract.address,1) * 得到password :0x412076657279207374726f6e67207365637265742070617373776f7264203a29

  • 调用实例部署 的合约,并调用合约的 unlock() 函数:

  • image-20230224184434452

  • 3.3 对比调用 unlock() 函数之后locked 的值

  • image-20230224184617438

  • image-20230224184732157

  • 3.4 提交案例并查看结果

  • image-20230224184920626

  • 3.5 成功!!!!

评论



政策 · 统计 | 本站使用 Volantis 主题设计