Security 如何利用这个简单的智能合约?

Security 如何利用这个简单的智能合约?,security,ethereum,solidity,smartcontracts,exploit,Security,Ethereum,Solidity,Smartcontracts,Exploit,我已经尝试了很多方法来利用以太坊区块链的Solidity编写的这个简单代币合同;然而,我无法成功地做到这一点 pragma solidity ^0.8.2; contract SimpleToken{ mapping(address => uint) public balances; function buyToken() payable public { balances[msg.sender]+=msg.value / 1 ether; } function sendT

我已经尝试了很多方法来利用以太坊区块链的Solidity编写的这个简单代币合同;然而,我无法成功地做到这一点

pragma solidity ^0.8.2;

contract SimpleToken{

mapping(address => uint) public balances;

function buyToken() payable public {
    balances[msg.sender]+=msg.value / 1 ether;
}

function sendToken(address _recipient, uint _amount) public {
    require(balances[msg.sender]!=0); // You must have some tokens.
    balances[msg.sender]-=_amount;
    balances[_recipient]+=_amount;
    }
}
我已经能够通过向sendToken()函数发送事务来实现这种利用,但我正在尝试编写一个契约,作为它的利用代码

以下是我尝试过的:

pragma solidity ^0.8.2;

import "./vuln.sol";

contract Exploit {
    
    function buyPoisoned() payable public {
        SimpleToken t = new SimpleToken();
        t.buyToken{gas: 50000, value: 10}();
    }

    function exploit(address recpt, uint amount) public {
        SimpleToken t = new SimpleToken();
        t.sendToken{gas: 50000}(recpt, amount);
    }
}
我也尝试过Solidity编译器的早期版本(更准确地说是0.4.2),但是我没有成功

我不知道我错过了什么使它工作


提前感谢您的帮助

由于合同以0.8的稳健性编制,目前似乎尚未开发

Solidity 0.8在整数下溢/上溢时引入了自动异常,请参阅

我运行了源代码,它也没有发现任何漏洞


如果它是用v0.7.6或更旧版本编译的,它将容易受到以下行的影响:
balances[msg.sender]=\u amount

例如,您有100个令牌,并且希望发送200:

它将通过
require()
检查,并从100(实际余额)中减去200(发送金额),这将导致整数下溢:

  • msg.sender
    将有2^256-101个令牌(因为在整数下溢的情况下,0-1将导致2^256-1)
  • \u收件人
    将拥有200个代币(已发送金额)

很高兴知道EVM从v0.8开始检查下溢/上溢,不知怎么的,这个练习是为0.4.2构建的,我认为这没什么大不了的,在这种情况下,我尝试了delegatecall()来保留易受攻击的契约中的更改,但更改没有保留。
delegatecall
使用上下文(存储和平衡,除了
msg
全局变量)调用方。因此,如果
漏洞
是delegatecall的目标,则无法更新其存储。