Tyojong

[The Ethernaut] Force 본문

web3/The Ethernaut

[The Ethernaut] Force

Tyojong 2026. 1. 28. 17:21

문제 설명


코드 분석

이번 문제의 컨트랙트 코드를 보면 이더를 받기 위한 함수가 정의되지 않았다.

 

원래 컨트랙트에서는 이더를 받기 위해 receive() 함수, fallback() 함수, payable 함수를 사용해야한다.

해당 함수들을 사용하지 않는 컨트랙트에 이더를 보내면 해당 트랜잭션은 revert된다.

Selfdestruct

selfdestruct는 solidity에서 스마트 컨트랙트를 블록체인에서 제거하고, 남은 이더를 지정된 주소로 강제 전송하는 함수이다.

이 함수를 사용하게 되면 컨트랙트의 어떤 코드도 실행하지 않고 강제로 이더를 전송하게 된다. receive나 fallback이 없어도, 이더 수신을 거부하는 로직이 있어도 강제로 받게 된다.


익스플로잇

공격 컨트랙트를 생성하여 selfdesturct를 이용해 공격컨트랙트를 삭제함과 동시에 문제 컨트랙트로 이더를 강제 전송시키면 된다.

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

contract ForceAttack {
        constructor() payable {}

        function attack(address _target) public {
                selfdestruct(payable(_target));
        }
}

컨트랙트 삭제 시 이더가 전송될 수 있도록 공격컨트랙트에 이더를 저장하기 위해 constructor를 payable로 설정하였다.

이후 attack함수를 실행시키면 공격 컨트랙트가 삭제되면서 공격 컨트랙트의 이더가 인자로 넣은 주소로 전송될 수 있도록 구성하였다.

 

초기 문제 컨트랙트의 잔액은 0eth이다.

 

공격 컨트랙트를 배포하면서 --value 인자를 이용해 1wei를 공격 컨트랙트에 저장해 놓는다.

 

attack함수에 문제 컨트랙트 주소를 인자로 넣어 실행시키면

 

문제 컨트랙트의 잔액이 증가한 것을 볼 수 있다.

 

'web3 > The Ethernaut' 카테고리의 다른 글

[The Ethernaut] Vault  (0) 2026.01.28
[The Ethernaut] Delegation  (0) 2026.01.27
[The Ethernaut] Token  (0) 2026.01.26
[The Ethernaut] Coin Flip  (0) 2026.01.26
[The Ethernaut] Telephone  (0) 2026.01.07