攻击漏洞合约:

  1. 在transfer函数中,没有检查接收者地址是否为零地址,可以利用这一点将代币发送到零地址,导致代币被永久锁定。
  2. 在transfer函数中,没有检查接收者地址是否为合约地址,可以利用这一点将代币发送到一个恶意合约,导致恶意合约执行攻击逻辑。

修复漏洞合约:

  1. 在transfer函数中添加对接收者地址是否为零地址的检查,如果是零地址则禁止转账。
  2. 在transfer函数中添加对接收者地址是否为合约地址的检查,如果是合约地址则禁止转账。

修复后的合约代码如下:

pragma solidity ^0.6.12;

contract Token {
    mapping(address => uint) balances;
    uint public totalSupply;
    
    constructor(uint _initialSupply) public {
        balances[msg.sender] = totalSupply = _initialSupply;
    }
    
    function transfer(address _to, uint _value) public returns(bool) {
        require(balances[msg.sender] >= _value, "Insufficient balance");
        require(_to != address(0), "Invalid recipient");
        require(!isContract(_to), "Invalid recipient");
        
        balances[msg.sender] -= _value;
        balances[_to] += _value;
        return true;
    }
    
    function balanceOf(address _owner) public view returns(uint balance) {
        return balances[_owner];
    }
    
    function isContract(address _addr) private view returns(bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
}

修复后的合约添加了对接收者地址是否为零地址和是否为合约地址的检查,有效防止了上述两个漏洞的攻击

要求:1对给定漏洞合约进行攻击。2修复给定合漏洞。pragmasolidity^0612;contractTokenmappingaddress=uintbalances;uintpublictotalSupply;constructoruint_initialSupplypublicbalancesmsgsender=totalSupply=_initialSupply;functiontran

原文地址: http://www.cveoy.top/t/topic/iIlv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录