Balsn CTF 2020 - IdleGame
复现这一题的时候对Continuous Token
这个概念非常恐惧,看了非常久也没有完全理解这到底是个什么东西。我太容易提前陷入细节而忘记整个全景图,要时刻告诫自己在对整体有了足够的掌握之后再去深入其中某一个细节。
作者的wp,作者在文章最后推荐了另外两篇wp,我照着其中的一篇写的exp。
Source
1 | pragma solidity =0.5.17; |
分析
题目其实有两个文件,但是另外一个Tokens.sol
是引用其他开发者实现的一些标准token与协议,题目的重点其实是在上面给出的代码中。但是我花了很长的时间去研究Tokens.sol
中的内容。
Tokens.sol
包含以下的内容:
- SafeMath库
- ERC20标准接口
- 闪电贷FlashERC20的接口
- 一种ContinuousToken的合约实现
SafeMath库的作用是防止整数溢出,ERC20是以太坊上代币的标准,这两个之前多多少少有接触过。闪电贷理解起来还算容易,就是在同一笔交易内完成借款和还款,在借款和还款之间允许用户执行自己的代码。
但是ContinuousToken搞得我一脸懵逼,我不理解它产生的原因和作用。但是就这一题来说,只需要理解它的几个重要特性就可以做题。其中一个就是下面这个公式:
在只增加IDL token的总供应supply的情况下,当前token的价格会下降。原理就是这么简单。
所以说只需要在闪电贷的期间利用已有的BSN去购买降价的IDL,在闪电贷结束之后重新把价格恢复原价的IDL换回BSN,这样倒买倒卖就可以无限盈利。
Exploit
必须要部署在ropsten上,因为题目依赖一个外部的Bancor合约。
Setup: 0xA462b2CACC4825091dDB23bba720e8FbCC913077
BalsnToken: 0xAC88c6FEf2192baaA856CfAc7FFf73E40980DbE5
IDLE: 0x4569e2D0bB5a4D89A925FBAbe3804b385721a2e2
1 |
|