Real Wolrd CTF 3rd Writeup | Easy Defi
2021-05-29

题目环境架构

EasyDefi是一道面向去中心化金融服务的智能合约题目。
题目代码通过附件的形式给出。

同时我们可以通过题目描述了解到
ChaitinSwap的逻辑和Uniswap基本类似,只是更改了手续费比例。
在这里插入图片描述

ChaitinBank听上去是某种提供了借贷服务的Defi项目,
我们看一下代码:

Bank仅提供了两个功能接口,一个用FeiCoin换Flag,另一个使用Flag换FeiCoin。
但是这个FeiCoin又是个啥?我们到ERC20.sol里面确认一下:
在这里插入图片描述

可见这里Panda币的合约名称叫FeiToken,看来FeiCoin和PandaToken是一个东西:

至此我们可以得到题目大概的组织框架如下:
在这里插入图片描述

一共存在三种代币: 长亭币、Panda币和FLAG
在ChaitinSwap中,长亭币 和 Panda币可以互换
在ChaitinBank中,Panda币和FLAG可以互换

代码审计

vuln1 K值不守恒

我们来审计合约代码,根据题目描述中的提示。
chaitinSwap和uniswap的区别主要在手续费。
chaitinSwap仅收取0.25%的手续费。
所以我们来看定义手续费附近的代码
在这里插入图片描述

这里getAmountIn/Out函数中,有对0.25%的描述。
除此之外,在Factory合约的swap中也有相关描述。
在这里插入图片描述

于是我们发现了第一个漏洞点,这个ChaitinSwap的K值 不守恒。
为了表示0.25%的手续费,除数从1000改成了10000。
但是在377行进行比较时, 还是和Uniswap代码中原本的1000**2进行比较。
这导致最后的这个K值守恒的检查,很容易通过。
Uniswap的K值守恒是用大于等于号检查的,这个比较神奇,可以阅读这篇文章来详细分析一下。https://zhuanlan.zhihu.com/p/272241656

这里我们需要做的只是让amount1In或者amount0In为正数。我们稍稍向合约中转账(比如题目给我们准备的1个长亭币)就可以满足此限制。
之后我们将取出的amount0Out和amount1Out写得大一些,只要balance0Ajusted和balance1Adjusted相乘不要过小即可。

这样我们就可以用1个长亭币换出了大量的PandaToken和长亭币。

具体操作如下,
第一步把1 个长亭币转到chaitinToken-feiToken pair 合约中

第二步 调用pair合约的swap函数,把钱从流通池里掏出来

至此, 我们成功从交易所中 盗取了90个PandaToken和 88个长亭币

vuln2 Bank没有用预言机,可以操纵币价

然而题目要求我们搞到80个Flag币

我们知道能得到FLAG的地方只有,BANK合约
在这里插入图片描述

而且我们可以看到,用户能得到多少个flag币,和存入的PandaToken的币价有关系
在这里插入图片描述

所以PandaToken价格越高,我们能得到的Flag越多。
此时的PandaToken币价为 11
在这里插入图片描述

阅读代码我们发现,这里Bank合约没有使用预言机来防止恶意操纵币价。
所以很明显这里便是第二个漏洞点。
攻击者可以通过恶意操纵市场,来抬高PandaToken的币价。
我们通过Router合约可以实现该目的。

具体操作如下:
这里先Approve给Router全部的长亭币
在这里插入图片描述

然后调用Router.swapExactTokensForTokens 函数来拉动币价。
我们使用长亭币疯狂购买PandaToken,从而抬高PandaToken的币价。

接着我们来到Bank合约,查看PandaToken的价格

发现PandaToken的币价已经高达829了

看到这么高的币价, 我们直接
调用depositFeiCointoFlag函数, 用手中全部的PandaToken来换取Flag
在这里插入图片描述

在这里插入图片描述

接下来,我们看看自己有多少个FlagToken

82.9个FLAG,满足题目要求。

获取FLAG

最后我们回到命令行界面,选择option3 并输入token
在这里插入图片描述

得到FLAG
rwctf{axelytxtdznhahsebhk}

相关链接

  • 题目介绍和附件 https://github.com/chaitin/Real-World-CTF-3rd-Challenge-Attachments/tree/main/Easy%20Defi
  • 为什么说Uniswap的K值不那么守恒 https://zhuanlan.zhihu.com/p/272241656
  • Uniswap文档 https://uniswap.org/docs/v2/
  • AMM自动做市商原理 https://www.jianshu.com/p/5bb44a9cd220