swuforce

[워게임 공부]BISC safe

범호야 2025. 9. 30. 23:44

뭐 잘못했나..

 

그러면 위에서 확인한 크롬 확장 프로그램에서 opensafe()라는 함수에서 유저의 계정을 call하고 있다. 

그리고 console창에서 내 계정이 나와야 하는데 안 나온다 .

GPT: ethereum 확장 프로그램 환경에 ethereum 객체가 없으니 생기는 오류라고 설명한다. 

(https://juchan-story.tistory.com/45 : 여길 참고해서 MetaMask 확장프로그램을 설치했다. ) 


이제 콘솔 창에 log는 나오는데 입력을 하려고 하면 오류가 뜬다. 

문제를 보니 sepolia로 변경하고 하라고 한다. 

변경하는 것도 어렵다... 

꼭 "크롬확장프로그램"의 MetaMask에 들어가서 https://support.metamask.io/configure/networks/how-to-view-testnets-in-metamask/ 해당 링크에서 하라는데로 하면 된다. 꼭꼭 크롬확장프로그램으로 들어가야 한다...꼭! 꼬끼오~

이로써 문제 풀면서 생긴 오류는 다 수정했다! 


공부 

코드 분석 

// SPDX-License-Identifier: MIT
pragma solidity >= 0.7.0 < 0.9.0;

contract Safe {
    address public owner;
    string private flag =  "bisc2023{FAKE_FLAG}";

    constructor() {
        owner = msg.sender;
    }

    function opensafe() public view returns (string memory) {
        if(owner == msg.sender){
            return flag;
        }
        else {
            return "Your not owner!!";
        }
    }

    function changeOwner(address _owner) public {
        require(owner == msg.sender, "Your not owner!!");
        owner = _owner;
    }
}

다운로드 한 문제파일이다. 

 

  • 배포 시점의 배포자 주소를 owner로 저장.
  • opensafe()는 호출자(msg.sender) 가 owner와 같을 때만 flag 문자열을 반환.
  • changeOwner()는 현재 owner만 다음 소유자를 지정 가능.

이런 기능을 담고 있는 코드이다. .sol 확장자는 Solidity 언어로 작성된 스마트컨트랙트 소스 코드 파일

.sol 파일은 이더리움 네트워크 위에서 실행되는 "코드(프로그램)"를 담고 있는 문서라고 보면 된다. 

 

크롬확장프로그램 분석

const start = async () => {
    if(window.ethereum !== "undefined") {
            const accounts = await ethereum.request({method: "eth_requestAccounts"});
            account = accounts[0];
            console.log(`my contract: ${account}`);
    }
      const ABI = [
	{
		"inputs": [
			{
				"internalType": "address",
				"name": "_owner",
				"type": "address"
			}
		],
		"name": "changeOwner",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	},
	{
		"inputs": [],
		"stateMutability": "nonpayable",
		"type": "constructor"
	},
	{
		"inputs": [],
		"name": "opensafe",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "owner",
		"outputs": [
			{
				"internalType": "address",
				"name": "",
				"type": "address"
			}
		],
		"stateMutability": "view",
		"type": "function"
	}
];
      const ADDRESS = "0x5e992854Bd912ae170b7b5b8a64323e4e5E0feAF";
      window.web3 = await new Web3(window.ethereum);
      window.contract = new web3.eth.Contract(ABI, ADDRESS);
      console.log(`safe contract: ${window.contract.options.address}`);
  }
  start();
  async function openSafe() {
    try {
      const result = await window.contract.methods.opensafe().call({from: account});
  
      if (result === "Your not owner!!") {
        document.getElementById('result').innerText = result;
      } else {
        document.getElementById('result').innerText = result;
        var door = document.getElementById('door');
        door.style.transform = 'rotateY(-90deg)';
      }
    } catch (error) {
      console.error(error);
    }
  }

 

메타마스크 같은 지갑을 통해 Sepolia testnet에 배포된 Safe 컨트랙트와 연결하고,  버튼 클릭 시 opensafe()를 호출해서 결과를 화면에 보여주는 흐름

window.ethereum: 브라우저에 설치된 메타마스크가 제공하는 객체.

eth_requestAccounts: 사용자에게 지갑 연결을 요청 → 계정 주소(들) 반환

ABI: 컨트랙트의 함수 정의(JSON).

new Web3(window.ethereum): Web3 인스턴스를 메타마스크 provider와 연결

window.contract.methods.opensafe() : Solidity의 opensafe() 함수에 접근.

중요한 요소들에 대해 정리했다. 

흐름은 

 

  • 메타마스크 연결
    • 사용자의 지갑 주소(account) 확보.
  • 컨트랙트 인스턴스 생성
    • ABI + 컨트랙트 주소로 Safe 컨트랙트 객체 생성.
  • 금고 열기 버튼 클릭 → openSafe() 실행
    • opensafe() 함수 호출 (msg.sender = account).
    • 컨트랙트 내부에서 if (owner == msg.sender) 검사.
      • true → flag 문자열 반환.
      • false → "Your not owner!!" 반환.
  • 프론트엔드 결과 반영
    • flag를 얻으면 문(door) CSS 회전 → 금고 열림 애니메이션.
    • 아니면 에러 메시지 출력

위와 같이 진행된다. 

 

web3란?

Web2 (네이버, 구글, 인스타 같은 중앙 서버 기반 인터넷)와 달리 Web3는 블록체인 같은 탈중앙화(decentralized) 기술을 기반으로 한 새로운 인터넷 패러다임

 

  • 데이터 소유권: 데이터는 기업 서버에 있지 않고 블록체인에 기록됨
  • 지갑 주소가 인터넷 아이디처럼 쓰임
  • 스마트컨트랙트로 자동 실행되는 앱 (DApp, 탈중앙 앱)

 

  • web3.js는 자바스크립트에서 이더리움 블록체인과 상호작용할 수 있게 해주는 라이브러리 
  • 메타마스크 같은 지갑이 제공하는 provider(window.ethereum) 를 연결해서 사용
  • 할 수 있는 일:
    • 계정 가져오기: web3.eth.getAccounts()
    • 잔액 조회: web3.eth.getBalance(address)
    • 트랜잭션 보내기: contract.methods.transfer(...).send({from: account})
    • 컨트랙트 읽기: contract.methods.myData().call()