MagicNumber
1. 题目要求
1.1 To solve this level, you only need to provide the Ethernaut with a
Solver
, a contract that responds towhatIsTheMeaningOfLife()
with the right number.Easy right? Well… there’s a catch.
The solver’s code needs to be really tiny. Really reaaaaaallly tiny. Like freakin’ really really itty-bitty tiny: 10 opcodes at most.
Hint: Perhaps its time to leave the comfort of the Solidity compiler momentarily, and build this one by hand O_o. That’s right: Raw EVM bytecode.
Good luck
1.2 译:要解决这个关卡,你只需要向 Ethernaut 提供一个,一个用正确的数字
Solver
响应的合约。whatIsTheMeaningOfLife()
简单吧?嗯…有一个问题。
求解器的代码需要非常小。真的很小。就像 freakin’ really really itty-bitty tiny:最多 10 个操作码。
提示:也许是时候暂时离开 Solidity 编译器的舒适环境,并手动构建这个 O_o。没错:原始 EVM 字节码。
祝你好运!
1.3 题目代码:
1 | // SPDX-License-Identifier: MIT |
-
2. 分析
tips: 参考博客
2.1有一个在调用时
whatIsTheMeaningOfLife
应答0x000000000000000000000000000000000000000000000000000000000000002a
(bytes32) 的函数。这是十进制的 42 的十六进制转换。2)我们的合约代码必须小于10字节这些要求似乎无法实现,即使使用原始字节码来定义函数、处理函数选择器等,也将远远超过 10 字节的代码。
但是我们真的需要有那个功能吗?最后,我们必须塑造合约代码才能通过挑战。如果我们的合同,无论它如何执行,只返回42怎么办?
这就是诀窍!如果你认为它就像拥有一个 Solidity 智能合约而不是只有一个
fallback
函数,那么无论你尝试低级调用哪个函数,它都将始终且只执行该fallback
函数。2.2 现在我们需要部署我们刚刚在上一节中编写的最小合约。当一个智能合约被创建时(via
CREATE
orCREATE2
opcode),EVM 会执行一次构造函数代码,并且部署的智能合约的代码会被 opcode 返回RETURN
(这个返回的代码称为运行时代码,它是将要执行的代码当您与智能合约交互时)参考视频 写的攻击合约:
1 | contract Hack { |
3. 解题
- 3.1 获取关卡实例地址:0x5072f4af6D9B0907833C43b199000347158f685d
- 3.2 传入实例地址部署攻击合约
- 3.3 提交实例
- 3.4 成功!!!!