簡體   English   中英

如何利用這個簡單的智能合約?

[英]How to exploit this simple Smart Contract?

我一直在嘗試很多方法來利用這個用 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() function 發送交易來實現這種利用,但我正在嘗試編寫一個合約作為它的利用代碼。

這是我嘗試過的:

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 在 integer 下溢/溢出上引入了自動異常,請參閱文檔

我通過mythril運行源代碼,也沒有發現任何漏洞。


如果它是用 v0.7.6 或更早版本編譯的,它將容易受到行 balances balances[msg.sender]-=_amount;上的integer 下溢的影響; .

例如你有 100 個代幣,你想發送 200 個:

它將通過require()檢查,並從 100(實際余額)中減去 200(發送金額),這將導致 integer 下溢:

  • msg.sender將有 2^256 - 101 個令牌(因為在 integer 下溢的情況下,0-1 會導致 2^256-1)
  • _recipient將有 200 個代幣(發送金額)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM