BISC Safe
BISC 지하실에 숨겨진 금고에 신입사원인 드림이가 가장 큰 거래처와의 미팅을 앞두고 거래용 플래그를 가져올 수 있는 관리자 인증 컨트랙트를 잃어버렸다고 하네요. 하필 금고도 해킹이 어려
dreamhack.io
문제 설명
BISC 지하실에 숨겨진 금고에 신입사원인 드림이가 가장 큰 거래처와의 미팅을 앞두고 거래용 플래그를 가져올 수 있는 관리자 인증 컨트랙트를 잃어버렸다고 하네요. 하필 금고도 해킹이 어려운 블록체인으로 만들어져 있어서 강제로 꺼내기도 힘든 상황인거 같습니다..
앗! 가장 큰 거래처와의 미팅이 얼마 남지 않았습니다! 이대로 가다가는 드림이는 회사에서 쫓겨나게 될겁니다.. 여러분들이 드림이를 도와서 플래그를 찾고 드림이의 해고를 막아주세요!
(컨트랙트를 연결할 때는 Sepolia 테스트 네트워크로 변경한 뒤 연결하고 문제를 풀어주세요)
풀이

safe.sol 파일이 들어있다
SOL 파일이 뭐지.. 일단 공부
>> SOL Extension이있는 파일은 주로 대화식 웹 컨텐츠를 만드는 데 사용되는 Adobe Flash 플랫폼과 관련이 있습니다. 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
내 지갑의 주소와 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 |