Solidity

如何“.call”另一個使用“.call”的合約的函式

  • October 3, 2022

所以,我正在學習高級智能合約開發。兩天前,我學習了 Reentrancy 攻擊,然後我還創建了兩個合約Protocol.sol(脆弱合約)+ Hacker.sol(攻擊者合約)來測試我的知識。我能夠順利執行所有操作,我在我的Hacker.sol. 今天了解到,我們可以在不導入 ABI 的情況下呼叫另一個智能合約函式,只需通過“.call”和委託呼叫使用合約地址。所以,為了測試我的知識,我使用了 Protocol.sol 和 Hacker.sol。

Protocol.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

contract Protocol {
   mapping(address => uint256) public balances;

   function deposit() public payable {
       balances[msg.sender] += msg.value;
   }

   function withdraw() public payable {
       require(balances[msg.sender] > 0, "BRUH");
       (bool success, ) = (msg.sender).call{value: 1 ether}("");
       require(success);
       balances[msg.sender] = 0;
   }

   function getBalance() public view returns(uint256) {
       return address(this).balance;
   }
}

Hacker.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

contract Hacker {

   function protocolDeposit(address protocol) public payable {
       (bool success,) = protocol.call{value: msg.value}(abi.encodeWithSignature("deposit()"));
       require(success, "call failed");
   }

   function attack(address protocol) public payable {
       (bool hacked,) = protocol.call(abi.encodeWithSignature("withdraw()"));
       require(hacked, "attack failed");
   }

   // fallback() external payable {
   //     (bool hacked,) = protocol.call(abi.encodeWithSignature("withdraw()"));
   //     require(hacked, "hack failed");
   // }

   function rektMoney() public view returns(uint256) {
       return address(this).balance;
   }
}

我現在面臨的問題是呼叫withdraw()func。我可以將 ETHHacker.sol存入Protocol.sol,但我無法withdraw()使用attack

可能是因為裡面的withdrawfuncprotocol.sol也是call用來轉賬ETH的。

如何“.call”另一個使用“.call”的合約的函式?

我該如何解決這個問題?請幫助,在此先感謝

你需要刺穿receivefallback運作才能在你的黑客合約中收到錢。

// function to receive eth from others                                           
receive() external payable {
       emit receivedMoney(msg.sender, msg.value); // event to emit when receive eth , this is optional
}

因為你還沒有實現這就是你面臨這個問題的原因。

還有一件事你需要讓你withdraw()attack(address protocol)功能得到支付,因為我們不接受該功能中使用者的任何 ETH。

我希望您理解,如果不評論以更好地理解。

祝你有美好的一天😊

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