Tyojong

[The Ethernaut] Delegation 본문

web3/The Ethernaut

[The Ethernaut] Delegation

Tyojong 2026. 1. 27. 17:11

문제 설명


코드 분석

Delegate 컨트랙트는 배포 시 owner가 정해지지만 pwn() 함수를 이용해 owner를 호출한 사용자로 변경할 수 있다.

 

Delegation 컨트랙트는 배포시 호출한 사용자가 owner로 지정된다.

fallback() 함수는 컨트랙트에 존재하지 않는 함수를 호출할 경우 실행된다.

 

fallback() 함수에서는 address(delegate)를 통해 위 Delegate 컨트랙트를 불러온다.

Delegate컨트랙트의 함수를 delegatecall을 이용해 호출한다.

call vs delegatecall
CA1에서 CA2의 함수를 call로 호출하면 CA2의 storage를 이용하지만CA1에서 CA2의 함수를 delegatecall로 호출하면 CA1의 storage를 이용하게 된다.

 

delegatecall 사용시 인자로 들어가는 msg.data에는 함수 식별자가 들어간다.

사용자가 Delegation에서 pwn()함수 호출 시 pwn() 함수 식별자가 delegatecall로 들어가 호출되게 된다.

(서로 다른 컨트랙트에 동일한 함수명이라면 두 함수는 함수 식별자가 동일하다.)


익스플로잇

Delegation 컨트랙트의 owner를 변경할 함수가 존재하지 않지만 delegatecall을 이용해 Djelegate컨트랙트의 pwn() 함수를 호출하게 되면 Delegation컨트랙트의 storage에 저장되어있는 owner가 pwn() 함수 코드에 의해 변경되게 된다.

cast send 명령어를 사용해 pwn() 함수를 호출하기만 하면

 

문제가 해결된다.

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

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