Challenge #4 - Side Entrance
一个非常简单的池允许任何人存入 ETH,并在任何时间点取出它。
它已经有 1000 ETH 余额,并且正在使用存入的 ETH 提供免费闪电贷来推广他们的系统。
从余额 1 ETH 开始,通过从池中取出所有 ETH 来通过挑战。
这道题也是提供借贷,但是是通过调用我们的execute函数来给我们转账,这就为我们提供了编写攻击合约的思路,合约提供了三个函数deposit,withdraw和flashLoan,仔细观察,不难发现,flashLoan函数最后的判断是:
只要借贷后池子的余额和之前相同或大于即可,在deposit函数中:
我们会把钱发给合约,并且增加我们在balances映射中的值,这就代表我们可以把借出来的钱再存进合约,最后通过withdraw函数取得池子所有的钱。
这里我们选择编写新的合约
attack.sol:
在合约中构造execute函数,在借贷池向我们发钱时,我们把钱通过deposit函数存到池子中,最后取钱并发给我们自己。
side-entrance.challenge.js:
注意:不要忘记了receive收钱函数!
测试: