1. 문제

이 Solver 컨트랙트는 whatIsTheMeaningOfLife() 라는 함수를 호출했을 때
올바른 32바이트 숫자를 반환해야 합니다.

쉬워 보이죠? 그런데… 문제가 하나 있어요.

이 Solver 컨트랙트의 코드 크기 제한이 엄청 작습니다.
진짜로 엄청엄청 작아요. 딱 10바이트 이하여야 합니다.

📌 힌트:
이제 Solidity 컴파일러의 편안한 품을 떠나, 순수 EVM 바이트코드를 직접 작성할 시간이 왔습니다.
맞아요, 직접 Raw EVM bytecode로 만들어야 합니다. 😱
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MagicNum {
    address public solver;

    constructor() {}

    function setSolver(address _solver) public {
        solver = _solver;
    }

    /*
    ____________/\\\\\\_______/\\\\\\\\\\\\\\\\\\_____        
     __________/\\\\\\\\\\_____/\\\\\\///////\\\\\\___       
      ________/\\\\\\/\\\\\\____\\///______\\//\\\\\\__      
       ______/\\\\\\/\\/\\\\\\______________/\\\\\\/___     
        ____/\\\\\\/__\\/\\\\\\___________/\\\\\\//_____    
         __/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_____/\\\\\\//________   
          _\\///////////\\\\\\//____/\\\\\\/___________  
           ___________\\/\\\\\\_____/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_ 
            ___________\\///_____\\///////////////__
    */
}

2. 문제 이스터에그

32바이트 숫자를 반환하라고해서 어떤 숫자를 반환해야하는건데 대체!!!!!!!!!!! 라고 한참동안 고민함

근데 왓…? 문제에 적혀있었네

/*
____________/\\\\\\_______/\\\\\\\\\\\\\\\\\\_____        
 __________/\\\\\\\\\\_____/\\\\\\///////\\\\\\___       
  ________/\\\\\\/\\\\\\____\\///______\\//\\\\\\__      
   ______/\\\\\\/\\/\\\\\\______________/\\\\\\/___     
    ____/\\\\\\/__\\/\\\\\\___________/\\\\\\//_____    
     __/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_____/\\\\\\//________   
      _\\///////////\\\\\\//____/\\\\\\/___________  
       ___________\\/\\\\\\_____/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_ 
        ___________\\///_____\\///////////////__
*/

42…….

실제로 ethernaut 문제 코드를 조금 살펴봤는데 아래 구문을 발견할 수 있었다.

https://github.com/OpenZeppelin/ethernaut/blob/master/contracts/src/levels/MagicNumFactory.sol

// magic이 42인지 체크
bytes32 magic = solver.whatIsTheMeaningOfLife();
if (magic != 0x000000000000000000000000000000000000000000000000000000000000002a) return false;

3. 문제 분석

whatIsTheMeaningOfLife() 라는 함수를 호출 했을 때 42를 반환하면 되는 문제이다.

function whatIsTheMeaningOfLife() public returns (uint256) {
    return 42;
}

다만 위처럼 solidity 코드로 작성하면 코드 크기가 10바이트 초과 되므로 바이트코드를 작성하여 문제를 풀어야한다