swuforce 심화팀/워게임 스터디

[드림핵] BISC Safe

ran831 2025. 9. 23. 22:33

BISC Safe | 워게임 | Dreamhack

 

BISC Safe

BISC 지하실에 숨겨진 금고에 신입사원인 드림이가 가장 큰 거래처와의 미팅을 앞두고 거래용 플래그를 가져올 수 있는 관리자 인증 컨트랙트를 잃어버렸다고 하네요. 하필 금고도 해킹이 어려

dreamhack.io


문제 설명

BISC 지하실에 숨겨진 금고에 신입사원인 드림이가 가장 큰 거래처와의 미팅을 앞두고 거래용 플래그를 가져올 수 있는 관리자 인증 컨트랙트를 잃어버렸다고 하네요. 하필 금고도 해킹이 어려운 블록체인으로 만들어져 있어서 강제로 꺼내기도 힘든 상황인거 같습니다..

앗! 가장 큰 거래처와의 미팅이 얼마 남지 않았습니다! 이대로 가다가는 드림이는 회사에서 쫓겨나게 될겁니다.. 여러분들이 드림이를 도와서 플래그를 찾고 드림이의 해고를 막아주세요!

(컨트랙트를 연결할 때는 Sepolia 테스트 네트워크로 변경한 뒤 연결하고 문제를 풀어주세요)

 

 

풀이

safe.sol 파일이 들어있다

SOL 파일이 뭐지.. 일단 공부

 

>> SOL Extension이있는 파일은 주로 대화식 웹 컨텐츠를 만드는 데 사용되는 Adobe Flash 플랫폼과 관련이 있습니다. SOL 파일은 플래시 쿠키라고도하는 공유 객체를 저장한다고 한다

파일 확장자 SOL- 어떻게 열 수 있습니까?.

 

파일 확장자 SOL- 어떻게 열 수 있습니까?.

File Extension Sol은 Adobe Flash 기술과 관련이 있으며 공유 객체가 포함 된 파일에 사용됩니다. 공유 객체는 때때로 플래시 쿠키라고합니다. Shared-Objects는 플래시 영화가 여러 세션에서 지속되는 데이

fileinfobase.com

 

일단 visual studio로 열어봤습니다

이런 코드가 있음

 

● contract Safe

owner는 public

flag는 private이므로 외부에서 접근이 불가능함을 확인 가능

● constructor()

msg.sender가 owner로 설정되게 함

● opensafe()

owner만 flag 값을 볼 수 있고, msg.sender가 owner가 아니면 "Your not owner!!"이라는 문자열 반환

changeOwner

msg.sender가 owner일 때만 소유권을 넘길 수 있음

 

vm 접속해보니 금고가 있다

열기 버튼 눌러도 안뜸

 

    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);
    }
  }

devtool로 들어가보니 이런 스크립트가 있음

openSafe() 부분을 보면 account 주소 불러와서 owner랑 같으면 풀리는 문제인듯

 

 

일단 sepolia network 로 연결을 했습니다

열기 누르고 나니까 your not owner!! 이라는 문구가 제대로 뜨네욤

 

my contract 랑 safe contract 확인 완료

 

eth_getStorageAt RPC Method | Ethereum Docs

 

eth_getStorageAt RPC Method | Ethereum Docs

Learn how to use eth_getStorageAt RPC Method on Ethereum with our easy-to-follow API documentation. Get the details you need to integrate eth_getStorageAt into your web3 projects on Ethereum.

www.quicknode.com

1번 storage 값이 flag 값인 듯.. 근데 확인이 안됩니다

 

연어가 되어.. 위의 코드 다시 살펴봄

 

사실 처음 문장은 다른 분 블로그 참고해서 풀었어요

[dreamhack] BISC-SAFE

 

[dreamhack] BISC-SAFE

내 지갑의 주소와 Owner 지갑의 주소가 동일하면 풀리는 문제... 그럼 이 주소를 어떻게 불러오는 지 확인해보자 를 통해 주소를 불러오고 있음을 확인하였고, owner의 주소의 경우, window.contract.metho

velog.io

 

opensafe() 부분 확인했을 때 msg.sender == owner 이라는 조건이 있어서 owner 값을 읽을 수 있었슨

그리고 owner 주소로 opensafe() 호출하니 답이 나왔다!!

 

았사.

'swuforce 심화팀 > 워게임 스터디' 카테고리의 다른 글

[드림핵] image-storage  (0) 2025.10.28
Web Goat를 통한 XSS 실습  (0) 2025.09.30
[드림핵] xss-1  (0) 2025.09.30
rev-basic-3 공부 내용 정리  (0) 2025.09.23
[드림핵] rev-basic-3  (1) 2025.09.22