[英]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.