이 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;
}
/*
____________/\\\\\\_______/\\\\\\\\\\\\\\\\\\_____
__________/\\\\\\\\\\_____/\\\\\\///////\\\\\\___
________/\\\\\\/\\\\\\____\\///______\\//\\\\\\__
______/\\\\\\/\\/\\\\\\______________/\\\\\\/___
____/\\\\\\/__\\/\\\\\\___________/\\\\\\//_____
__/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_____/\\\\\\//________
_\\///////////\\\\\\//____/\\\\\\/___________
___________\\/\\\\\\_____/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_
___________\\///_____\\///////////////__
*/
}
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;
whatIsTheMeaningOfLife() 라는 함수를 호출 했을 때 42를 반환하면 되는 문제이다.
function whatIsTheMeaningOfLife() public returns (uint256) {
return 42;
}
다만 위처럼 solidity 코드로 작성하면 코드 크기가 10바이트 초과 되므로 바이트코드를 작성하여 문제를 풀어야한다