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



我已经尝试了很多方法来利用这个用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(,但我没能成功。

我不知道我错过了什么才能让它发挥作用。

提前感谢您的帮助!

由于该合同是用Solidity 0.8编译的,因此目前似乎无法开发。

Solidity 0.8引入了整数下溢/上溢的自动异常,请参阅文档。

我通过mythril运行源代码,它也没有发现任何漏洞。


如果使用v0.7.6或更低版本编译,则它很容易受到balances[msg.sender]-=_amount;行整数下溢的影响。

例如,您有100个代币,并且您想要发送200:

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

  • msg.sender将有2^256-101个令牌(因为在整数下溢的情况下,0-1会导致2^256-1(
  • _recipient将有200个代币(发送的金额(

相关内容

  • 没有找到相关文章

最新更新