闯入Web3:链上智能合约Hacking

本文介绍了作者作为web2背景的CTF选手,在Taipei Blockchain Week期间通过Ethernaut平台学习和实践Web3智能合约hacking的经验。文章详细解释了如何使用MetaMask与以太坊测试网络交互,理解gas费用,以及如何通过Chrome DevTools与智能合约进行交互,并逐步演示了如何解决Ethernaut的第一个挑战“Hello Ethernaut”。

闯入 Web3:破解链上智能合约

从 web2 到 web3 CTF 以及台北区块链周

这篇博客献给我在台北区块链周:Onboard AI(以下简称 TBW)期间遇到的聪明、了不起且鼓舞人心的人们(虽然不仅限于他们)。 在我们交流知识时,我发现许多人对网络安全感兴趣,这促使我写了这篇文章。

连续 3 年参加 TBW!

理解 Web3 的运作方式对我来说一直是一个挑战,特别是因为我总是试图从更技术的角度来处理它。 因此,我将分享一些对我有用的方法。

正如我通过黑客攻击的方式来接触 Web3 一样,我相信其他人也可以通过自己的优势来探索它。 例如,具有金融头脑的朋友可以分析 DeFi 协议,如 AaveUniswap; 监管机构可以使用 TRM Labs 的工具深入研究代币化和合规性; 营销人员可能会研究社区如何围绕 dApp 形成。 我希望这篇博客展示了一条道路,同时提醒你有很多方法可以理解 Web3,或者任何一般的新概念。

免责声明:我已经熟悉编程和技术细节六年了,因此我在学习新的技术相关主题时,我的方法可能与你的有所不同。 不过,我希望这篇博客能够激励你找到自己应对新挑战的方式。

“要破解东西,你必须了解它是如何运作的。”

作为一个觉得黑客攻击很迷人的人,自从 2022 年我开始 夺旗赛 (CTF) 之旅以来,我就一直坚持这种心态。 对于那些不熟悉 CTF 概念的人来说,可以把它想象成一场数字寻宝游戏,你侵入一个故意存在漏洞的目标(通常是服务器或应用程序),并找到一个隐藏的文件,称为“flag”,作为成功的证明。

我的 CTF 之旅始于传统的 Web 和系统安全领域,通过 Hack The BoxTryHackMe,这两个平台都用于练习黑客技能和技术。 但随着 TBW 即将到来,并且我的许多朋友已经深入 Web3,我的好奇心终于战胜了我。

感谢 ETH Global她 Ta Zhi Dao 在今年三月举办的一场活动,我在那里遇到的一位朋友向我介绍了 Web3 CTF 的世界。 这对我来说都是全新的,我想看看“链上黑客攻击”是什么感觉。 这也让我有机会应用同样的心态:要破解东西,你必须了解它是如何运作的。 这就是我最终投入我的第一个 Web3 CTF:Ethernaut 的原因。

Ethernaut 是一个在以太坊虚拟机 (EVM¹) 中进行的 Web3/Solidity 战争游戏。 它由许多级别(或者,用 CTF 的术语来说,“盒子”)组成,每个级别的目标都非常简单:通过声明所有权来破解智能合约²。

33 个 Ethernaut 级别

我选择 Ethernaut 的原因是它对初学者友好。 以太坊智能合约使用 Solidity 编程语言,该语言与 JavaScript 非常相似。 此外,像 Ethernaut 这样的 Web3 CTF 倾向于白盒风格,因为它们允许玩家完全访问 Solidity 源代码,让我可以在进行黑客攻击的同时学习该语言。

还有其他基于 CardanoSolana 的智能合约 CTF,但它们是用 Plutus(构建在 Haskell 编程语言之上)、Rust 或 C 编写的,这些目前不在我的考虑范围内。

本技术文章基于“Hello Ethernaut”实例,这是 33 个 Ethernaut 挑战的第一个级别。 我已将其分解为两个部分:

  1. 了解智能合约并与之交互:介绍智能合约如何运作的基础知识,并展示 Solidity 代码如何成为链上逻辑。
  2. 应对挑战:我如何解决“Hello Ethernaut”实例的演练。

了解智能合约并与之交互

通过 Ethernaut 在链上玩 CTF 需要你浏览器中的 MetaMask 扩展程序(我使用的是 Google Chrome)。 MetaMask 是一个 加密钱包,它连接到以太坊区块链,让你使用 ETH 与 dApp 交互并进行交易,这就是 Ethernaut 需要 MetaMask 的原因。

在此处阅读有关 dApp 及其与常规应用程序有何不同的更多信息:https://www.solulab.com/what-are-dapps-how-they-are-different-from-normal-apps/

请记住,每个加密钱包都有一个地址。 将该地址想象成你可以向其汇款的银行帐号。

主网 vs. 测试网

真正的 ETH vs 模拟 ETH

MetaMask 钱包默认连接到主要的以太坊网络,称为主网。 主网(main network)是使用 ETH 和 ERC-20 代币 (例如 USDT)进行真实交易的地方。

另一方面,有测试网(test networks)。 这些是沙箱或游乐场,用户可以在其中试验 dApp 和智能合约,而无需使用真正的 ETH,从而消除了损失实际资金的风险。

值得庆幸的是,Ethernaut 合约(CTF “级别”)已部署在以太坊测试网上,使我们能够安全地进行实验,而不会造成任何实际损失。 有几个以太坊测试网,其中最受欢迎的是 Sepolia 和 Holešky(取代了较旧的测试网,如 Ropsten)。 Ethernaut 平台支持其中一些测试网,包括上面提到的两个。 由于 MetaMask 默认为主网,因此玩家需要将其钱包的网络切换到测试网(我使用的是 Sepolia),挑战合约已部署在该测试网上并准备好被破解。

Gas 费

在链上做任何事情的成本

由于 Web3 CTF 构建在智能合约之上,因此每次交互都需要 Gas 费(与通常在 HTTP 上运行的 Web2 CTF 不同)。Gas 是一种单位,用于衡量在以太坊网络上执行操作所需的计算工作量。 这些工作包括发送 ETH 或代币,或执行智能合约。

这意味着我们的 MetaMask 钱包中需要少量 ETH,以支付与挑战合约交互时的 Gas 费。 回想一下,由于 Ethernaut 在测试网上运行,因此我们使用的 ETH 不是真实的。 测试网 ETH 可以通过“水龙头”免费检索。 由于我选择使用 Sepolia 测试网,因此我从 Sepolia 水龙头 获取了一些代币。 交易成功后,你将能够查看交易详情。

成功的 Sepolia ETH 交易

更多关于 Gas:https://ethereum.org/developers/docs/gas/ https://academy.binance.com/en/articles/how-do-gas-fees-work-on-ethereum

与智能合约互动

与智能合约对话

在 Ethernaut 中,与挑战实例交互的常用方法是通过 Chrome DevTools(或任何浏览器控制台)。 在开始一个级别时,Ethernaut 会为你部署一个有漏洞的实例。 此实例由一个名为 contract 的对象表示,该对象由方法和属性组成,类似于面向对象编程中的对象的概念。

由于每个实例都是智能合约,因此它有自己的唯一地址,该地址与你的 MetaMask 钱包地址不同(你可以在连接后通过 player 属性查看它,也可以直接在你的 MetaMask 钱包中查看)。

通过 Ethernaut 的实例查看用户的地址

通过 MetaMask 钱包查看用户的地址

查看你的钱包余额是游戏的关键部分。 在许多可用的辅助命令中,最常见的一个是:

getBalance('<你的钱包地址>')

这会返回一个 Promise(一个表示你稍后将从异步函数获得的值的对象)。 你可以展开 Promise 以查看你的钱包余额,或使用 await 以获得更无缝的体验(在 Chrome v62 及更高版本中可用)。

对于其他实用程序函数,请在 Chrome DevTools 中键入 help(),以查看一堆用于与智能合约交互的有用命令。

Ethernaut、Contract 和架构

游戏管理员 vs 你自己的实例

我最初对 ethernaut 和 contract 之间的区别感到困惑,所以我决定剖析这两者。 简而言之:

  1. Ethernaut:跟踪你的级别并让你请求新的挑战实例的游戏管理员。
  2. Contract:你当前级别的个人实例。 一旦你解决了它,结果将报告给游戏管理员。

你不是在破解 ethernaut; 你正在破解 contract

这两者都是部署在区块链上的智能合约,这意味着每个都有自己的唯一地址。 在图表中:

每个实例名称对应于一个级别。 每个级别都是它自己的智能合约,具有自己的地址。

流程:部署 Solidity 和人与合约的交互

从代码到链:Solidity 如何成为合约

“Ethernaut 是一个 TruffleContract 对象,它包装了部署在区块链上的 Ethernaut.sol 合约。”

简单来说:Ethernaut 只是一个在以太坊区块链上运行的智能合约。

每个智能合约都用其各自的编程语言编写,Solidity 是以太坊的主要编程语言。 上图显示了 .sol 源文件如何被编译并最终部署为我们与之交互的 ethernaut 对象。 一些关键术语:

  • Ethernaut.sol:主游戏合约的 Solidity 源文件。
  • 字节码:从 Solidity 编译的低级代码; EVM 执行的机器可读版本。
  • TruffleContract:一个使人与合约的交互更容易的 JavaScript 包装器。
  • ABI:.sol 文件中定义的用户可以调用的函数列表。 将其视为 Web2 中 API 的 Web3 表亲。

第一个图显示了如何编译和部署 .sol 文件,以便可以轻松地与之交互。 下面的第二个图翻转了视图,显示了用户如何通过包装器与合约交互。

例如,以 contract.transfer(…) 为例,这是将代币从你的帐户发送到另一个地址的函数调用。 从概念上讲,以下是幕后发生的事情:

  1. 用户调用:contract.transfer('0x1..', 10) 启动请求。
  2. TruffleContract 包装器:接收调用并查找匹配的 ABI 条目。
  3. ABI 编码器:构建低级有效负载 (tx.data),包括函数选择器和编码参数。
  4. 原始交易数据:打包的交易。
  5. MetaMask:使用你的私钥对交易进行签名并发送。
  6. 以太坊节点:将签名的交易广播到网络。
  7. EVM:在指定的地址执行智能合约字节码。

应用程序二进制接口

智能合约函数的菜单

由于玩 Ethernaut 涉及大量的 ABI 调用,因此了解基础知识很有用。 ABI(应用程序二进制接口)以 JSON 格式编写。 这是一个示例:

{
"name": "transfer",
"type": "function",
"inputs": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ],
"outputs": []
}

此 ABI 描述了一个名为 transfer 的函数,该函数采用两个输入:

  • To:接收者的地址
  • Value:要发送的代币数量

与此 ABI 交互等效于调用 transfer 函数(将特定数量的代币发送到给定的地址)。 我们将在下一节中看到如何使用 Hello Ethernaut 实例的 ABI 的示例。

有关 ABI 的更多背景信息:https://www.cyfrin.io/blog/what-is-a-smart-contract-abi-and-how-to-get-it

应对挑战:Hello Ethernaut

Hello Ethernaut 实例需要支付 0.0094 SepoliaETH 的网络费用,支付给 ethernaut.openzeppelin.com。 创建新的关卡实例后,将调用 ethernaut.createLevelInstance(address) 函数。 系统将提示你授权交易,一旦确认,你就可以开始玩了。

每个合约都有自己的 ABI,你可以使用 contract.abi 查看。

Hello Ethernaut 实例有 11 个 ABI 函数。 如果你从调用 info() 开始,它会给你一些最终揭示一个数字 42 的数组的指示。 在 11 个函数中,有一个名为 info42() 的函数,显然是下一个最相关的步骤。

调用 contract.info42() 告诉我们调用另一个函数:theMethodName。 遵循这一连串的指示最终会揭示一个密码,你需要将该密码提交给 authenticate() 函数。

一连串的函数调用揭示了一个密码

查看 authenticate() ABI,你会看到它采用一个输入参数:密码。

通过 await contract.authenticate('ethernaut0') 提交密码会弹出一个确认提示。 确认后,交易数据显示我们已成功“破解”了该实例。 要完成关卡,请单击页面底部的“提交”,这会将你的实例发送回 Ethernaut 合约,从而验证实例的完成情况。

最后,Ethernaut 会显示你刚刚与之交互的 Solidity 代码。

闭幕词

感谢阅读! 这是我写过的最长、技术性最强的文章之一。 如果你走到了这一步,恭喜你!

我最初计划也包括对第二个 Ethernaut 级别的撰写,但它很快变得太长且细节繁琐。 如果你对下一个挑战 (Fallback) 感兴趣,请在此处查看第 2 部分:我的第一次链上黑客攻击:Fallback

非常感谢来自 TBW 的朋友们,他们慷慨地分享了他们的知识,并指导我完成了我的第一步! 也很高兴看到你们这么多人对网络安全感兴趣。 这激励我将黑客攻击和 Web3 融入到这篇博客中。 希望你喜欢它,让我们尽快再见!

[1] EVM:一个去中心化的计算引擎,可在以太坊网络上运行智能合约。

[2] 智能合约:存储在区块链上的程序,会在满足条件时自动执行。

  • 原文链接: blog.blockmagnates.com/b...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
The New Crypto Publication on The Block