Ethernaut 题库闯关 #12 — Privacy

Ethernaut题库闯关连载第12篇题解

今天这篇是Ethernaut 题库闯关连载的第12篇,难度等级:难。 Ethernaut 题库闯关我已经整理为一个专栏了, 欢迎大家订阅专栏。

挑战12:Privacy

本次挑战的合约(Privacy合约)很小心地使用私有变量去保护其存储的敏感数据。我们需要猜测出私有数据,并unlock这个合约, 合约的源码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Privacy {
bool public locked = true;
uint256 public ID = block.timestamp;
uint8 private flattening = 10;
uint8 private denomination = 255;
uint16 private awkwardness = uint16(now);
bytes32[3] private data;
constructor(bytes32[3] memory _data) public {
data = _data;
}
function unlock(bytes16 _key) public {
require(_key == bytes16(data[2]));
locked = false;
}
/*
A bunch of super advanced solidity algorithms...
,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`
.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,
*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^         ,---/V\
`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.    ~|__(o.o)
^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'  UU  UU
*/
}

本次挑战和第 8 关:Vault 有相似点,可以先复习一个第 8 关,在来挑战。 这一关要求我们了解:

  • 了解存储的原理

  • 了解参数解析的原理

  • 了解类型转换的原理

提示: 记住Metamask只是一种工具,如果它出现了问题,请使用其他工具。高级游戏可能涉及到使用remix,或你自己的web3提供者。

研究合约

合约本身很简单,有许多状态变量,一个constructor(构造函数)和一个unlock(解锁)函数。 我们只对两个变量感兴趣,其他状态变量是无用的:

  • bool public locked,初始化为真,必须设置为假才能赢得挑战。
  • bytes32[3]private data是存储密钥的变量。我们需要找出data[2]的值来解决这个挑战。 我们可以看到所有其他的变量只是作为 "存储填充",以达到我们想要读取的内容(data[2])来解决挑战。 constructor(bytes32[3] memory _data)只是初始化了data变量的值。然后函数unlock(bytes16 _key),简单地检查传递的byte16 _key输入是否与data[2]的值匹配。如果比较结果返回 true,我们就已经解锁合约并通过了挑战。 我们需要掌握三个概念,才能解决这个挑战。
  • 信息如何存储在区块链中。private变量是真正的私有吗?
  • 存储中的变量是如何布局的
  • 类型转换是如何工作的(我们需要将data[2]bytes32向下转换到bytes16)。 我们先来了解一下私有变量及状态变量布局

Solidity私有变量和状态变量的布局

当你使用或在区块链上开发时,你必须记住的第一件事是,在区块链上没有什么是隐私的。即使你把一个变量声明为 privateinternal,一切都可以被看到...

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

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

0 条评论

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