Skip to content
On this page

揭秘 DeFi 漏洞:智取 DEX,掌控数字资产的秘密!

在数字货币的世界里,去中心化交易所 (DEX) 扮演着至关重要的角色,它允许用户在无需中心化机构的情况下进行代币交易。然而,就像任何复杂的系统一样,DEX 也并非无懈可击。今天,我们将深入一个名为 "Dex" 的 CTF(Capture The Flag)挑战,揭示如何通过巧妙的价格操纵,从看似安全的 DEX 合约中“窃取”数字资产。

挑战背景:一个简单的 DEX 合约

我们的目标是一个名为 Dex.sol 的智能合约,它实现了一个基础的去中心化交易所功能。在这个挑战中,你将扮演一名“攻击者”,起始拥有 10 个 token1 和 10 个 token2。而 DEX 合约本身则拥有 100 个 token1 和 100 个 token2 作为初始流动性。

胜利的目标:

  • 耗尽至少一种代币: 你的任务是成功地从 DEX 合约中提取至少一种代币,使其余额归零。
  • 制造“坏”价格: 同时,你需要让 DEX 合约报告一个“错误”或“失衡”的价格,这表明价格操纵已经成功。

理解 DEX 的运作机制:

要成功破解这个挑战,理解 DEX 合约的核心功能至关重要:

  1. 价格计算 (getSwapPrice): DEX 合约通过一个简单的公式来计算交易价格: swapAmount = (amount * IERC20(to).balanceOf(address(this))) / IERC20(from).balanceOf(address(this)) 这意味着,价格与目标代币在合约中的余额成正比,与发送代币在合约中的余额成反比。
  2. 交易 (swap): 这个函数允许用户在一个代币和另一个代币之间进行兑换。它首先检查交易的代币是否有效,然后根据当前合约中的代币余额计算兑换量。接着,它会从用户那里转移要发送的代币,并将计算出的兑换数量的另一个代币转移给用户。
  3. 添加流动性 (addLiquidity): 这个函数允许合约的拥有者向 DEX 添加代币作为流动性。
  4. 代币授权 (approve): 在 ERC20 代币的标准交互中,通常需要先授权合约代表你花费你的代币。在这个挑战中,Dex 合约为了简化,将 approve 方法集成到了合约自身。这意味着你可以直接调用 contract.approve(contract.address, <uint amount>) 来授权 DEX 合约花费你的代币。

破解之道:价格操纵的艺术

核心的攻击思路在于利用 DEX 合约中 getSwapPrice 函数的计算方式。通过在不同代币之间进行多次、不平衡的交易,我们可以人为地扭曲合约中的代币余额比例,从而影响后续交易的价格。

策略分解:

  1. 获取代币: 首先,你需要将你拥有的 10 个 token1 和 10 个 token2 转移到你的攻击合约中。
  2. 授权 DEX: 接着,你需要授权 DEX 合约可以花费你攻击合约中的 token1token2。这里需要注意的是,由于 Dex 合约的 approve 方法是针对 SwappableToken 的,你需要使用 IERC20(token_address).approve(address(target), type(uint).max) 来进行授权。
  3. 制造价格扭曲: 这是攻击的关键步骤。
    • 小额兑换: 频繁地进行小额的、不平衡的兑换。例如,用少量的 token1 去兑换大量的 token2,或者反之。
    • 累积效应: 重复这个过程。每一次兑换都会改变合约中两种代币的余额比例。如果你用 token1 换取大量的 token2,那么 token2 在合约中的余额会增加,而 token1 的余额会减少。这样,下次再用 token2token1 时,你就能获得更多的 token1,进一步加剧价格的扭曲。
    • “死亡螺旋”: 通过多次这样的操作,你可以让一种代币在合约中的余额变得非常少,而另一种代币的余额变得非常多。
  4. 耗尽代币: 在价格扭曲到一定程度后,你可以执行一个最终的、大额的交易,以极低的价格(对你来说)耗尽合约中剩下的一种代币。
  5. 制造“坏”价格: 当你成功耗尽一种代币时,DEX 合约中的价格计算公式将出现除以零的情况,或者产生一个极度失衡的价格,从而满足“bad price”的要求。

示例攻击合约 (Hack.sol) 解析:

提供的 Hack.sol 合约就是实现了上述攻击思路的一个范例:

  • 它首先从攻击者那里获取初始代币。
  • 然后,它会授权 DEX 合约花费这些代币。
  • _swap 函数被反复调用,目的是通过连续的、不平衡的交易来操纵代币在 DEX 合约中的余额比例,制造价格扭曲。
  • 最后,一次大额的 target.swap(address(t2), address(t1), 45) 操作,旨在消耗掉 DEX 中剩余的大部分 token1,从而达到耗尽代币并制造“坏”价格的目的。

重要提示:

  • Gas 费用: 在以太坊上执行智能合约操作都需要支付 Gas 费用,多次交易可能会累积一定的 Gas 成本。
  • Remix IDE: Remix 是一个非常方便的 Solidity 集成开发环境,可以帮助你部署合约、与之交互以及调试。
  • “At Address”: 在 Ethernaut 平台中,“At Address” 功能允许你连接到一个已经部署的合约实例,而不是重新部署一个新的。

总结

这个 "Dex" CTF 挑战不仅是一个技术性的难题,更是一个生动的案例,展示了 DeFi 智能合约中潜在的漏洞以及利用价格机制进行攻击的可能性。通过深入理解合约的运作方式,并巧妙地运用价格操纵的技巧,你就可以成功地“智取”DEX,掌控数字资产的流动。

这个挑战强调了在开发和审计智能合约时,对价格计算逻辑的严格审查是多么重要。一旦价格机制存在缺陷,即使是最简单的 DEX,也可能成为攻击者的目标。

Built with AiAda