主页 > imtoken冷钱包官网 > Wault 金融漏洞分析

Wault 金融漏洞分析

imtoken冷钱包官网 2023-03-31 05:56:42

Wault 金融漏洞分析

时间:2021-08-10

本文为您介绍Wault Finance漏洞分析,主要包括Wault Finance漏洞分析用例、应用技巧、基础知识点总结和注意事项。 具有一定的参考价值usdt交易平台漏洞,需要的朋友可以参考一下。

攻击信息:

攻击交易:

0x31262f15a5b82999bf8d9d0f7e58dcb1656108e6031a2797b612216a95e1670e

攻击契约:

0x886358f9296de461d12e791bc9ef6f5a03410c64

过程分析:步骤 1:

首先通过闪贷借入16,839,004 WUSD,调用WUSDMaster合约的赎回函数将USDT和WEX发送给攻击合约。 成本大于0.015 USDT/WEX。

第二步:

通过闪贷借入40000000USDT,其中23000000usdt兑换成WEX,计算成本,0.044USDT/WEX。

第三步:

通过多次抵押,抬高了wex的价格。

最后计算的价格是 1.44 USDT/WEX。

第四步:

将 WEX 兑换成 USDT。 在此之后价格为 0.041 USDT/WEX

第五步:

还清闪贷。

第六步:

最后盈利usdt交易平台漏洞,跨链。

代码分析:

 1     function redeem(uint256 amount) external nonReentrant {
 2         uint256 usdtTransferAmount = amount * (1000 - wexPermille - treasuryPermille) / 1000;
 3         uint256 usdtTreasuryAmount = amount * treasuryPermille / 1000;
 4         uint256 wexTransferAmount = wex.balanceOf(address(this)) * amount / wusd.totalSupply();
 5         wusd.burn(msg.sender, amount);
 6         usdt.safeTransfer(treasury, usdtTreasuryAmount);
 7         usdt.safeTransfer(msg.sender, usdtTransferAmount);
 8         wex.safeTransfer(msg.sender, wexTransferAmount);
 9         
10         emit Redeem(msg.sender, amount);
11     }

首先,通过调用redeem函数,攻击者可以获得目前最便宜的wex,然后使用闪贷借出大量资金,因为攻击者后面会砸盘,所以他用一部分来拉盘(这里指的是23000000那一笔),然后一部分用来重新抵押换取wex(用来把usdt换成wex)。 该部分用于填写通过闪贷借出wusd获得的wex和usdt。 (相当于帮用户高阶接机)

 1     function stake(uint256 amount) external nonReentrant {
 2         require(amount <= maxStakeAmount, 'amount too high');
 3         usdt.safeTransferFrom(msg.sender, address(this), amount);
 4         if(feePermille > 0) {
 5             uint256 feeAmount = amount * feePermille / 1000;
 6             usdt.safeTransfer(treasury, feeAmount);
 7             amount = amount - feeAmount;
 8         }
 9         uint256 wexAmount = amount * wexPermille / 1000;
10         usdt.approve(address(wswapRouter), wexAmount);
11         wswapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
12             wexAmount,
13             0,
14             swapPath,
15             address(this),
16             block.timestamp
17         );
18         wusd.mint(msg.sender, amount);
19         
20         emit Stake(msg.sender, amount);
21     }