
이미지는 평범해 보이지만 숨겨진 무언가가 있는 것 같습니다
=> 스테가노그래피? 파일 은닉? 예상하면서 가져왔다..
ftk부터 가보자


ftk imager로 열어보면 png와 파이썬이 있고 png는 보이는 게 없고, 파이썬은 코드가 적혀 있다
코드 해석를 해보면
1. 데이터 암호화 및 압축
XOR 연산을 통해 1차 암호화
Base 64 인코딩: 암호화된 데이터를 텍스트로 변환
zlib 압축: 데이터 크기 줄이기 위해 압축
=> 이미지에 숨겨진 진짜 데이터는 c
2. LSB 스테가노그래피
:각 픽셀의 RGB 색상 끝에서 1비트만 살짝 변환
3. 파일 결합
이미지 푸터(IEND): IEND 청크 위치를 탐색
데이터 결합: 정상 이미지에 데이터를 숨김 flag.png의 바이너리 내용을 이어붙임
=> 코드 순서를 역으로
1. 파일 뒷부분 추출 -> 2. LSB 비트 추출 -> 3. 압축 해제 -> 4. Base64 디코딩 -> 5. XOR 연산 해야 함
제미나이를 이용해 코드를 만들었다
import zlib as z
import base64 as b
from PIL import Image as I
try:
# 1. 이미지 로드
im = I.open("flag.png")
px = im.load()
width, height = im.size
# 2. LSB 비트 추출
bit_list = []
for y in range(height):
for x in range(width):
r, g, b_val = px[x, y]
# 각 채널의 LSB를 리스트에 추가
bit_list.append(str(r & 1))
bit_list.append(str(g & 1))
bit_list.append(str(b_val & 1))
bits = "".join(bit_list)
# 3. 비트를 바이트 객체로 변환
byte_arr = bytearray()
for i in range(0, len(bits), 8):
byte_str = bits[i:i+8]
if len(byte_str) < 8: break
byte_arr.append(int(byte_str, 2))
extracted_bytes = bytes(byte_arr)
# 4. zlib 데이터 찾기 (PNG 내부에 숨겨진 압축 데이터 시작점)
# zlib 헤더는 보통 0x78 0x9C로 시작합니다.
idx = extracted_bytes.find(b'\x78\x9c')
if idx != -1:
# 압축 해제
decompressed = z.decompress(extracted_bytes[idx:])
# Base64 디코딩
decoded_b64 = b.b64decode(decompressed)
# 5. XOR 복호화 (Key: 0x55)
k = 0x55
flag = "".join([chr(x ^ k) for x in decoded_b64])
print("-" * 30)
print("찾은 플래그: " + flag)
print("-" * 30)
else:
print("이미지에서 유효한 zlib 데이터를 찾을 수 없습니다.")
except Exception as e:
print(f"오류 발생: {e}")

플래그: DH{Supe3r _Dupe3r _H0td0g}
'SWUFORCE > Write-up' 카테고리의 다른 글
| VBR(파일시스템 실습) (0) | 2026.05.05 |
|---|---|
| Helfy image (0) | 2026.04.29 |
| Windows Search (1) | 2026.04.01 |
| FFFFAAAATTTT (0) | 2026.03.30 |
| Steg-Pack (0) | 2026.03.25 |