새소식

인기 검색어

Write Up/Ethernaut

[Ethernaut] Privacy

  • -
반응형

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

contract Privacy {

  bool public locked = true;
  uint256 public ID = block.timestamp;
  uint8 private flattening = 10;
  uint8 private denomination = 255;
  uint16 private awkwardness = uint16(block.timestamp);
  bytes32[3] private data;

  constructor(bytes32[3] memory _data) {
    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
  */
}

우리의 mission은 locked를 false로 만드는 것이다.

이 문제는 Vault이랑 비슷한 문제이다. private로 설정되어 있지만 Storage로 확인할 수 있다.

해당 변수를 slot으로 나타내면 그림과 같다.

StorageAt으로 확인해보면 그림처럼 구성이 되어 있다.

그럼 여기서 slo3 부분에 data이다. data는 32byte로 구성되어 있는데 16byte로 key가 주어진다. 32byte에서 16byte로 변환하면 하위 16byte가 잘려서 비교가 된다. byte를 짤라야 하는 데 solidity는 string, bytes는 big endian이고 나머지는 little endian이다. data[2]를 확인하니까 slot4의 data를 사용하면 된다.

0xebee50683eec214128f606e525b0c60b17a661e957e7cded35190c1885cddf98 -> 왼쪽 16byte를 남기면 0xebee50683eec214128f606e525b0c60b 된다.

locked가 false가 되었다.

반응형

'Write Up > Ethernaut' 카테고리의 다른 글

[Ethernaut] Alien Codex  (0) 2023.02.10
[Ethernaut] Recovery  (0) 2023.02.09
[Ethernaut] Naught Coin  (0) 2023.02.09
[Ethernaut] Gatekeeper Two  (0) 2023.02.09
[Ethernaut] Gatekeeper One  (0) 2023.02.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.