1. 문제 The Ethernaut The Ethernaut is a Web3/Solidity based wargame played in the Ethereum Virtual Machine. Each level is a smart contract that needs to be 'hacked'. The game is 100% open source and all levels are contributions made by other players. ethernaut.openzeppelin.com 문지기(gatekeeper)를 지나서 입장자(entrant)로 등록하라. // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GatekeeperOne {..
1. 문제 이 컨트랙트의 작성자는 스토리지의 민감한 부분에 대해 충분히 주의를 기울이고 컨트랙트를 작성했습니다. 이 컨트랙트의 잠금을 해제하시오. 도움이 될 만한 것들: * 스토리지 작동 원리 이해 * 함수의 파라미터가 어떻게 파싱되는지 이해 * 타입 캐스팅이 어떻게 동작하는지 이해 // 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..
1. 문제 빌딩의 꼭대기에 도달하라. (Elevator 컨트랙트의 top을 false에서 true로 바꿔라) // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface Building { function isLastFloor(uint) external returns (bool); } contract Elevator { bool public top; uint public floor; function goTo(uint _floor) public { Building building = Building(msg.sender); if (! building.isLastFloor(_floor)) { floor = _floor; top = building.isL..
1. 문제 아래 컨트랙트의 모든 자금을 탈취하라. // SPDX-License-Identifier: MIT pragma solidity ^0.6.12; import 'openzeppelin-contracts-06/math/SafeMath.sol'; contract Reentrance { using SafeMath for uint256; mapping(address => uint) public balances; function donate(address _to) public payable { balances[_to] = balances[_to].add(msg.value); } function balanceOf(address _who) public view returns (uint balance) { ret..
1. 문제 아래의 컨트랙트는 아주 간단한 게임입니다. 현재 컨트랙트의 상금보다 더 많은 금액을 컨트랙트에게 보내는 누구나 새로운 왕이 될 수 있습니다. 이 게임을 완전히 망가트려 보세요. *주의* 인스턴스를 제출할 때 관리자는 왕권을 다시 탈환하려 할 것입니다. 그러한 행위가 불가능하도록 하세요. // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract King { address king; uint public prize; address public owner; constructor() payable { owner = msg.sender; king = msg.sender; prize = msg.value; } receive() external p..
1. 문제 아래의 금고를 해제하라! // 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. 해법 TESTNET Sepolia (ETH) Blockchain Explorer Etherscan allows you to explore and search t..
1. 문제 아래의 컨트랙트의 잔액을 0보다 크게 만들어라 ¯\_(ツ)_/¯ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Force {/* MEOW ? /\_/\ / ____/ o o \ /~____ =ø= / (______)__m_m) */} 2. 해법 Force 컨트랙트를 공격하는 다음의 컨트랙트를 작성합니다. 생성자의 인수로 Force 컨트랙트의 주소와 약간의 이더를 받아서 attack 함수를 호출할 때 사용합니다. contract Attack { address public force; constructor(address _force) payable { force = _force; } function attack() public ..
1. 문제 주어진 인스턴스의 소유권을 탈취하라. 도움이 될만한 것: 저수준의 함수 'delegatecall'이 어떻게 동작하는지, 어떻게 온체인상의 라이브러리에게 동작을 위임하는지, 그리고 실행 범위에 어떤 영향을 미치는지 알아보라. Fallback 메서드 메서드 Ids // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Delegate { address public owner; constructor(address _owner) { owner = _owner; } function pwn() public { owner = msg.sender; } } contract Delegation { address public owner; Delegate..
1. 문제 당신은 20개의 토큰을 지급받은 상태로 시작한다. 아래의 컨트랙트에 가능한 한 많은 토큰을 탈취하라. 도움이 될만한 것: 오도미터가 무엇인가? // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; contract Token { mapping(address => uint) balances; uint public totalSupply; constructor(uint _initialSupply) public { balances[msg.sender] = totalSupply = _initialSupply; } function transfer(address _to, uint _value) public returns (bool) { require(balanc..
1. 문제 아래 컨트랙트의 소유권을 탈취하라. // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Telephone { address public owner; constructor() { owner = msg.sender; } function changeOwner(address _owner) public { if (tx.origin != msg.sender) { owner = _owner; } } } 2. 해법 기름기 싹 빼고 해법만 간단하게 적겠습니다. 이번에도 3번 문제와 유사하게 Telephone 컨트랙트를 공격하는 Attack 컨트랙트를 작성하고 배포합니다. contract Attack { address public telephone..