Ethernaut 靶场学习笔记 00:Hello Ethernaut
这是我的 Ethernaut 靶场个人学习笔记,用来记录每一关的题目目标、漏洞原理、利用过程和复盘要点,方便后续按关卡重新练习和查漏补缺。
- 关卡:Level 0 - Hello Ethernaut
本关目标
熟悉 Ethernaut 的基本操作:连接钱包、创建实例、在浏览器控制台调用合约、提交实例。
考察知识点
- Ethernaut 实例生命周期
- 浏览器控制台与异步合约调用
- 公开变量 getter
题目源码
1 | // SPDX-License-Identifier: MIT |
源码与漏洞解析
- 本关没有复杂漏洞,重点是建立操作习惯。Ethernaut 页面创建实例后,会在控制台暴露
contract、player、instance等变量,contract就是当前实例的 ABI 封装对象。 - 源码中
password是public,Solidity 会自动生成password()getter,所以控制台可以直接读到口令。cleared虽然是private,但这里只需要通过authenticate改它。 info2用keccak256(abi.encodePacked(param))比较字符串,所以参数必须是精确的hello。后续infoNum、theMethodName都是在训练如何根据返回值继续找下一个函数。
解题过程
- 连接钱包并选择测试网,创建本关实例。
- 在浏览器 DevTools Console 中逐个调用
info系列函数。 - 读取公开变量
password,把得到的口令传入authenticate。 - 回到页面提交实例。
Console WP
1 | await contract.info() |
最终 WP
- 创建实例后打开浏览器 DevTools Console。
- 按提示链式调用
info -> info1 -> info2("hello") -> infoNum -> info42 -> theMethodName -> method7123949。 - 读取
password()得到口令,调用authenticate(password)。 - 回到页面提交实例。
复盘与拓展
- 易错点:这是环境教学关,重点不是漏洞,而是理解 Ethernaut 的
contract变量就是当前实例的 Web3 合约对象。 - 防御建议:生产合约不要把敏感口令放在链上公开变量里;即使变量标成
private,链上存储也能被读取。
参考资料
- 相关资料:https://hackmd.io/@0xbc000/ryToeKj4a
- Ethernaut 官方仓库:https://github.com/OpenZeppelin/ethernaut
- Solidity 文档:https://docs.soliditylang.org/
- 标题: Ethernaut 靶场学习笔记 00:Hello Ethernaut
- 作者: Kylinxin
- 创建于 : 2026-05-01 09:00:00
- 更新于 : 2026-05-01 09:00:00
- 链接: https://kylinxin.github.io/2026/05/01/Ethernaut 靶场学习笔记 00:Hello Ethernaut/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。