Solidity

3級乙太傳輸

  • May 25, 2019
contract foster{
   vulnerable v = new vulnerable();
   attacker a = new attacker(address(v));

    constructor() public payable{

       //  a.deposit(address(v));     // transferring 3 ethers to vulnerable contract and rest to the attacker contract
       //  v.addNominee(address(a));
    }

    function action() public payable{
        a.deposit(address(v));     // transferring 3 ethers to vulnerable contract and rest to the attacker contract
        v.addNominee(address(a));
    }

    function getTargetBalance() public view returns(uint256, uint256){
       return (address(v).balance , address(this).balance);
   }

    function attack() public payable{
        v.transact();
    }
}

這就是我想做的。我有兩個契約attacker,即vulnerable具有以下定義。

合約攻擊者

contract attacker{ 

   constructor(address payable _vulnerableContract) public{
       vulnerable v = vulnerable(_vulnerableContract);
   }

   function deposit(address payable _addr) payable public{
       _addr.transfer(msg.value);
   }

   function() external payable{
      }

}

合約易受攻擊

contract vulnerable{

   mapping (address => uint256) balance;
   uint256 _amount;

   function() external payable{
   }

   function deposit() payable public{
       address(this).transfer(_amount);
   }
}

foster契約中,我想為vulnerable和分別創建一個實例attacker

我想讓合約中的函式action呼叫fostera.deposit(address(v))並將乙太幣從a的代表轉移到合約v。這樣淨乙太幣就從呼叫賬戶轉移到合約實例v

然後我想a作為被提名人添加到v實例中。

當我在做我在契約中所做的事情時,乙太幣會去contract foster而不是去v。我怎樣才能讓它發生?

我的最終目標是在呼叫時觸發一個failed send()錯誤v.transact,因為我需要一些帶有contract v. 我將在function() payable後面contract a添加一些失敗。

**找到解決方案。**謝謝,如果有人試圖這樣做。

我們需要在這裡做的事情是,在a.deposit()寄養契約中呼叫這里之後

我們需要將乙太轉移到v. 我在action()函式中添加了以下內容。它做所需的事情。

a.deposit(address(v));  
address(v).send(msg.value);

問題是醚首先轉移到contract foster,所以我們需要在這contract v之後將它轉移到。它解決了3級乙太傳輸的問題。


完整的解決方案位於以下要點連結: https ://gist.github.com/johnsoncarl/99d761df62da338a41ce3a3d6b162698

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