Level 1 Noob Hacker
Ethernaut 21 Denial
0 / 100 EXP 100 EXP to Junior Hacker
0%

Challenge 21 / Ethernaut

Denial

Goal

  1. Make Denial's owner withdrawal fail within a bounded gas budget.

Your task

Read Denial.sol, then complete Exploit.s.sol.

:~/targets/ethernaut-denial$
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @notice Adapted from OpenZeppelin Ethernaut level 20. The unbounded call to
/// `partner` intentionally lets a partner prevent the owner withdrawal.
contract Denial {
    address public partner;
    address payable public owner;
    uint256 public timeLastWithdrawn;
    mapping(address => uint256) public withdrawPartnerBalances;

    constructor(address payable initialOwner) {
        owner = initialOwner;
    }

    function setWithdrawPartner(address partnerAddress) external {
        partner = partnerAddress;
    }

    function withdraw() external {
        uint256 amountToSend = address(this).balance / 100;
        (bool sent,) = partner.call{value: amountToSend}("");
        sent;
        owner.transfer(amountToSend);
        timeLastWithdrawn = block.timestamp;
        withdrawPartnerBalances[partner] += amountToSend;
    }

    receive() external payable {}
}