Part 1: 취약 코드 분석
아래 코드들을 분석하고 각 취약점을 식별하세요.
실습 1-1: Reentrancy 취약점 분석
// 분석 대상 코드
contract VulnerableBank {
mapping(address => uint256) public balances;
function deposit() public payable {
balances[msg.sender] += msg.value;
}
function withdraw(uint256 _amount) public {
require(balances[msg.sender] >= _amount, "Insufficient balance");
(bool sent, ) = msg.sender.call{value: _amount}("");
require(sent, "Failed to send");
balances[msg.sender] -= _amount;
}
function getBalance() public view returns (uint256) {
return address(this).balance;
}
}
실습 1-2: Integer Overflow 분석
// 분석 대상 코드 (Solidity ^0.7.0)
pragma solidity ^0.7.0;
contract VulnerableToken {
mapping(address => uint256) public balanceOf;
uint256 public totalSupply;
function transfer(address _to, uint256 _value) public {
require(balanceOf[msg.sender] - _value >= 0); // 항상 true!
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
}
function batchTransfer(address[] memory _receivers, uint256 _value) public {
uint256 amount = _receivers.length * _value; // 오버플로우 가능
require(balanceOf[msg.sender] >= amount);
balanceOf[msg.sender] -= amount;
for (uint i = 0; i < _receivers.length; i++) {
balanceOf[_receivers[i]] += _value;
}
}
}
Part 3: CTF 챌린지
시뮬레이터에서 챌린지 시작
실제 메인넷에서 공격을 시도하지 마세요. 모든 실습은 시뮬레이터 또는 테스트넷에서만 진행합니다.
Challenge 1: EtherVault 초급
재진입 공격으로 Vault의 모든 ETH를 탈취하세요.
목표: 공격자 계약으로 Vault 잔액을 0으로 만들기
플래그 형식: FLAG{reentrancy_*****}
Challenge 2: TokenSale 초급
토큰 가격을 조작하여 무한 토큰을 획득하세요.
목표: 접근 제어 취약점을 이용해 토큰 가격을 0으로 변경
플래그 형식: FLAG{access_control_*****}
Challenge 3: OverflowVault 중급
정수 오버플로우를 이용해 토큰 잔액을 조작하세요.
플래그 형식: FLAG{overflow_*****}
Challenge 4-5: DeFi Protocol 중급 고급
복합 취약점을 찾아 프로토콜의 자금을 탈취하세요.
플래그 형식: FLAG{defi_*****}