Rootsquare가 기밀문서, 비자금, 그리고 황금빛 귤을 귤상자에 숨기다 0xB1NARY COMMUNITY 요원들에게 체포되었습니다!
하지만 상자를 열어보니 진짜로 귤밖에 없습니다! 대체 기밀을 어디에 숨겼다는 걸까요?
무엇보다... 이 상자는 하나의 상자가 아닌 것 같아요! 상자 안에 또 상자가 있는 것 같은데...?
B1N4RY{...}
받은 파일 압축을 풀면 jpg 파일 하나와 png 파일 하나가 있다.



일단 의심스러운건, 둘 다 사진 파일 치고는 너무 용량이 크다는 것. 이거이거 hxd로 열어봐야겠군

png 파일의 푸터 뒤에 추가로 Final Key가 붙어있는 것을 발견.. 어디에 쓰는 키일까?
이 상자는 하나의 상자가 아닌 것 같아요! 상자 안에 또 상자가 있는 것 같은데...?
라고 힌트를 문제에서 줬었으니 아무래도 big_box.jpg 안에 뭔가 있을 것 같다.
제일 박스 안에 박스니까.. small_box, box, Ym94(base64 로 box 인코딩 한 값)을 검색해봤으나 아니었음...

근데 얘 파일 끝나는 걸 보면 얘도 푸터가 가장 밑에 있진 않음... 흠 파일이 두개로 나뉘어 있나...?

jpg 파일 푸터 검색해보니 여러개가 뜬다.. 일단 첫번째 FF D9 이후 FFFFFF가 반복되는게 신경쓰이니 일단 여기서 파일이 끝난다고 가정하자. 그 뒤부분을 따로 추출해보기로 함.

오잉??? 이 뒷부분을 조금 ctrl+C해서 gemini에게 물어보니 bzip2 방식으로 압축된 데이터라고 한다.... 역시 jpg 뒤로 새로운 zip 파일이 있었던 거였어!!

일단 잘 모르겠으니 Unknown이라는 이름의 파일로 저장을 한다.

그리고 이 파일의 확장명을 .bx2 라고 변경해주면~~

오!!!!! small_box를 찾았다~!

enc 파일이 뭔지 검색해보자...
찾아보니 확장자가 enc인 파일은 암호화 된 파일로
일반 압축프로그램으로는 풀수가 없고
enc 압축해제 프로그램과 파일 비밀번호까지
알고있어야 풀 수 있다고 합니다
혹시 아까 찾은 Final key가 이거???
마지막으로 test.txt는

이런 내용을 우리에게 알려주고 있다.
아까 이미지에서 ROT를 되게 강조해놨길래... 궁금해서 ROT 검색해봤는데

이런 내용이 나온다!! 이거 문자 치환 암호도 포함하고 있구나!!!
아마 misc 내용이 이건가 보다... ROT 이후 숫자는 알려주지 않았으므로 저 rot_orange 파일에 그려진 숫자로 x를 알아내면 될 것 같다.
2026/3/27 오늘은 여기까지
2026/3/30 이어서 write-up 작성
그동안 정말정말 정말 많이 헤맸다... rotation 암호인것 같기도 하고 fianl key 저걸 써먹고 싶기도 하고!!!
그런데 정말 정답은 저 ROT 어쩌고 이미지에 있었다.

이 사진!!!!! 으으 짜증나지만 정말 간단하게 small_box.enc의 바이트를 x 라고 생각하고 저 64,128을 offset이라고 연관지으면???
바로
(x+offset)(mod 256)을 하면 된다는 결론이 나온다!!!!
내가 이걸몰라서 몇시간을 헤맸는지...

offset = 0x5D
with open("small_box.enc", "rb") as f:
data = f.read()
decrypted = bytes([(b - offset) % 256 for b in data])
with open("decrypted_file.zip", "wb") as f:
f.write(decrypted)
print("복호화 완료! decrypted_file.zip을 확인해보세요.")
간단하게 이런 파이썬 프로그램을 짜주고~~


이렇게 압축파일이 생기는데, 이걸 압축을 풀어주면????

또 다른 힌트와.... 또 다른 enc 파일이 있다...
hint를 열어보면,

오!!! 드디어 final key를 쓸 차례가 왔다!!!

final key는 다시 파일의 맨 처음으로 되돌아가 보면 find_the_gyul.png 맨 아래에 숨어 있었다.

일단 생각을 해보자면... gyul.png.enc 라고 이름이 되어있으니 아마 원래 png 파일인데 enc 암호화를 한 것 같다.
그럼?? hxd로 열어보고 시그니처가 png가 되게 복호화를 하면 되겠군!!

일단 눈으로 봐서는 잘 모르겠고,
final key : 7e1cbabc03360aa6a25d7c85ece471beb2d9517c23f38a1ccec4d0206c0e00f8
이걸 써먹어봐야할 것 같단 말이죠..
근데 저거 뭔가 해시 같이 생기기도 했고... 뭘까..

AES-256!! 이거 암호학 시간에 배운적 있단말이죠
AES-256은 256비트 길이의 대칭 키를 사용하여 데이터를 암호화하는 전 세계적으로 가장 널리 사용되는 최고 수준의 보안 표준이다~ !
아하! 그럼 저 final키가 대칭키겠죠?
좋아요. 그럼 이제 gemini에게 요구할걸 정리해봅시다
- AES-256 대칭키 암호화 방식으로 암호화된 gyul.png.enc
- final key : 7e1cbabc03360aa6a25d7c85ece471beb2d9517c23f38a1ccec4d0206c0e00f8
- 복호화 후 png 시그니처가 나오면 -> 성공 메세지를 띄우고 복호화한 png 파일 결과로 산출, 안나오면 실패 출력
=> 요 python 코드를 짜달라고 하겠어용
from Crypto.Cipher import AES
from Crypto.Util import Counter
import os
key_hex = "7e1cbabc03360aa6a25d7c85ece471beb2d9517c23f38a1ccec4d0206c0e00f8"
key = bytes.fromhex(key_hex)
with open("gyul.png.enc", "rb") as f:
data = f.read()
def save_result(name, content):
if content.startswith(b'\x89PNG'):
with open(name, "wb") as f:
f.write(content)
print(f"[*] {name} 복호화 성공! (PNG 헤더 확인됨)")
return True
return False
print("--- 복호화 시도 시작 ---")
# Case 1: AES-CBC (앞 16바이트가 IV인 경우)
try:
iv = data[:16]
ciphertext = data[16:]
cipher = AES.new(key, AES.MODE_CBC, iv)
dec = cipher.decrypt(ciphertext)
# 패딩 에러를 피하기 위해 직접 헤더 확인
if save_result("result_cbc_iv.png", dec): exit()
except: pass
# Case 2: AES-CTR (가장 흔한 스트림 모드, 패딩 필요 없음)
try:
# IV가 앞에 16바이트 있다고 가정
ctr = Counter.new(128, initial_value=int.from_hex(data[:16].hex()))
cipher = AES.new(key, AES.MODE_CTR, counter=ctr)
dec = cipher.decrypt(data[16:])
if save_result("result_ctr.png", dec): exit()
# IV 없이 처음부터 데이터인 경우 (Initial value 0)
cipher = AES.new(key, AES.MODE_CTR, counter=Counter.new(128, initial_value=0))
dec = cipher.decrypt(data)
if save_result("result_ctr_zero.png", dec): exit()
except: pass
# Case 3: AES-ECB (IV 미사용)
try:
cipher = AES.new(key, AES.MODE_ECB)
dec = cipher.decrypt(data)
if save_result("result_ecb.png", dec): exit()
except: pass
print("[-] 모든 시도가 실패했습니다. 파일 헤더나 암호화 방식을 재확인해야 합니다.")
짜자자잔!~~~
단, 이 코드를 실행하기 전에

pip install pycryptodome
해야하는거 잊지 말기!!!

(파일 이름이 iamtired.py인건... 너무 힘들어서...;;;)
복호화 성공 메세지와 실패 메세지가 둘 다 뜨는데,
코드 로직상 ECB 모드까지 검사한 뒤 루프가 끝나면서 나온 메시지일 뿐이니 걱정하지 않으셔도 됩니다!! 후후
일단 복호화 성공 메세지가 뜨면 된거에요~~~

파일로 돌아가보면, 이렇게 result가 뜬다ㅠㅠ!!!!

하 막 눈물이 날라그러네....
드디어 flag를 찾았다.. 문제 출제자 당신... 귤 10상자만큼 얄미웠어...!!!
B1N4RY{You_peeled_the_gyul}
이제 AI 없이 어떻게 CTF 푸는지 알려주실분....

'디지털 포렌식 > 워게임 풀이' 카테고리의 다른 글
| [flaws.cloud] Level 1 write up (0) | 2026.05.05 |
|---|---|
| [Dreamhack] My Nervous PPT (Level 1) misc, forensics (0) | 2026.03.31 |
| [Dreamhack] Hidden (Level 1) forensics (0) | 2026.03.22 |
| [Dreamhack] Hefty Image (Level 1) forensics (0) | 2026.03.22 |
| [Dreamhack] Take Your Glasses (Level 2) misc, forensics (0) | 2026.03.22 |