Ethernaut靶场实践(三)

本文详细介绍了Ethernaut靶场中的Privacy、Gatekeeper One、Gatekeeper Two、Naught Coin、Preservation和Recovery六个关卡的攻击策略。通过源码分析和智能合约交互,揭示了如何利用漏洞解锁、控制合约以及执行特定操作,展示了以太坊智能合约安全的重要性和实践技巧。
摘要由CSDN通过智能技术生成

13.Privacy

分析

源码:

// 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
  */
}

题目简单明了,需要我们调用unlock,而调用unlock的条件需要我们输进去的key与data[2]相同,很明显,与Vault一样,需要我们从solidity的存储机制入手。
unused(31) locked(1) ⇐ slot(0)
ID(32) ⇐ slot(1)
unused(28) flattening(1) denomination(1) awkwardness(2) ⇐ slot(2)
data[0](3 2) ⇐ slot(3)
data[1](3 2) ⇐ slot(4)
data[2](3 2) ⇐ slot(5)
从上面分析我们可以看到,data[2]存储在slot[5]

攻击

在控制台输入 await web3.eth.getStorageAt(contract.address,5),即可得到data[2]的值

继续执行data[2].slice(0,34),其中data[2]需换成你们自己上条指令得到的data[2],slice(0,34)是为了去掉后面的十六个字节,因为我们传进去的值只需要十六个字节.

最后执行 await contract.unlock(“第二条指令的值”),即可提交实例,过关。

14.Gatekeeper One

分析

源码:

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

import '@openzeppelin/contracts/math/SafeMath.sol';

contract GatekeeperOne {
   

  using SafeMath for uint256;
  address public entrant;

  modifier gateOne() {
   
    require(msg.sender != tx.origin);
    _;
  }

  modifier gateTwo() {
   
    require(gasleft().mod(8191) == 0);
    _;
  }

  modifier gateThree(bytes8 _gateKey) {
   
      require(uint32(uint64(_gateKey)) == uint16(uint64(_gateKey)), "GatekeeperOne: invalid gateThree part one");
      require(uint32(uint64(_gateKey)) != uint64(_gateKey), "GatekeeperOne: invalid gateThree part two");
      require(uint32(uint64(_gateKey)) == uint16(tx.origin), "GatekeeperOne: invalid gateThree part three");
    _;
  }

  function enter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值