-
[Ethernaut 풀이] 이더리움을 해킹해보자 - 7.ForceBlockChain/Technology 2021. 8. 12. 11:47
오늘의 풀어볼 문제는 Forece 입니다.
컨트랙트에 이더를 받기 위해서는 fallback 함수가 payable로 표시되어 있어야 합니다.
그러나 공격자가 selfdestruct를 통해 컨트랙트에 이더를 보낼 방법을 막을 수 없습니다.
address(this).balance == 0에 의존하지 않는 것이 중요합니다.
≪ Ethernaut 풀이 시리즈 ≫
[Ethernaut 풀이] 이더리움을 해킹해보자 - 2.Fallout
[Ethernaut 풀이] 이더리움을 해킹해보자 - 4.Telephone
[Ethernaut 풀이] 이더리움을 해킹해보자 - 6.Delegation
1. 목표 확인
이번 level의 목표는 컨트랙트의 잔액을 0보다 크게 만드는 것입니다.
Things that might help:
- Fallback methods
- Sometimes the best way to attack a contract is with another contract.
- See the Help page above, section "Beyond the console"
주어진 힌트는 fallback 함수와 다른 컨트랙트에서 공격하기, Beyond the console(이 말이 나오면 이제 remix를 킵니다.)입니다.
2. 문제 풀이
먼저 코드를 확인합니다. 코드에 내용은 없고 고양이 울고 있는 이모티콘만 있습니다(?).
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; contract Force {/* MEOW ? /\_/\ / ____/ o o \ /~____ =ø= / (______)__m_m) */}
① selfdestruct()
괘씸하지만 이번 미션은 힌트가 자세히 나온 편이므로 넘어가줍니다. 컨트랙트에 생성자 함수(constructor function)이 있었습니다. 생성이 있다면 파괴도 있는 것이 이치입니다. 솔리디티에는 selfdestruct를 만들어 놨습니다. 이름 그대로 자기 파괴의 기능을 하며 특수한 EVM 연산 코드에 의해 컨트랙트가 없어집니다.
selfdestruct(payable(address recipient));
이렇게 컨트랙트의 이더를 받을 주소를 정해놓고 함수를 만들면 끝입니다.
Remix에다가 다음과 같은 코드를 작성합니다.
pragma solidity 0.8.6; contract Transfer { constructor() payable { } function destroy() public { selfdestruct(payable(msg.sender)); } }
이제 컨트랙트를 배포하고 destroy 함수를 실행합니다. 배포할 떄 value값에 조금의 이더를 적어서 보내야 합니다. 컨트랙트의 잔액을 고양이 그림 컨트랙트로 보낼 것이거든요. 트랜잭션이 처리되면 자연스럽게(?) 컨트랙트가 파괴되면서 컨트랙트의 잔액이 고양이 컨트랙트로 전송이 됩니다. 컨트랙트에 payable이 없지만 selfdestruct로 보내는 이더는 강제로 받게 됩니다. 이번 level의 미션 완수했습니다. Submit instance 버튼을 눌러 제출을 완료합니다. 수고하셨습니다.
목표 달성 !
컨트랙트의 잔액을 0보다 크게 만들기'BlockChain > Technology' 카테고리의 다른 글
같이보는 블록체인 개념 (6) 트랜잭션이 처리되는 과정 (2) 2021.08.17 [Ethernaut 풀이] 이더리움을 해킹해보자 - 8.Vault (0) 2021.08.12 [Ethernaut 풀이] 이더리움을 해킹해보자 - 6.Delegation (0) 2021.08.12 [Ethernaut 풀이] 이더리움을 해킹해보자 - 4.Telephone (0) 2021.08.11 [Ethernaut 풀이] 이더리움을 해킹해보자 - 2.Fallout (0) 2021.08.11