Ethernaut 靶场学习笔记 02:Fallout
这是我的 Ethernaut 靶场个人学习笔记,用来记录每一关的题目目标、漏洞原理、利用过程和复盘要点,方便后续按关卡重新练习和查漏补缺。
- 关卡:Level 2 - Fallout
本关目标
利用构造函数拼写错误,获得 Fallout 合约 owner。
考察知识点
- 构造函数历史写法
- 函数名拼写错误
- public 初始化函数风险
题目源码
1 | // SPDX-License-Identifier: MIT |
源码与漏洞解析
- Solidity 0.6 已经支持
constructor关键字,但这份代码保留了旧式注释/* constructor */,函数名却写成Fal1out。 Fallout中第二个字符应该是字母l,源码里Fal1out使用了数字1,因此它不是构造函数,而是一个普通的public payable函数。- 普通外部用户可以直接调用这个函数,函数内部把
owner = msg.sender,所以 owner 会被调用者接管。
过程截图

图注:调用误写初始化函数后 owner 变化的记录。
解题过程
- 观察源码中
Fal1out使用数字 1,而不是合约名里的字母 l。 - 该函数是 public,任何地址都能调用。
- 发送一笔很小金额调用
Fal1out(),触发 owner 赋值。
Console WP
1 | await contract.owner() |
最终 WP
- 调用前先查看
owner()。 - 调用
Fal1out({value: toWei("0.000001")})。 - 再次查看
owner(),确认已经变成自己的地址。 - 提交实例。
复盘与拓展
- 易错点:Solidity 0.4.22 之后推荐
constructor关键字,就是为避免这类拼写事故。 - 防御建议:使用现代编译器;初始化函数必须加访问控制和一次性初始化保护。
参考资料
- 相关资料:https://hackmd.io/@0xbc000/SkJgDcs4T
- Ethernaut 官方仓库:https://github.com/OpenZeppelin/ethernaut
- Solidity 文档:https://docs.soliditylang.org/