본문 바로가기

드림핵

[워게임] BMP Recovery

BMP Recovery | 워게임 | Dreamhack

 

BMP Recovery

DescriptionBMP 파일에서 이런 중요한 값들을 지워버리다니!빨리 복구해서 플래그를 읽어주세요!플래그 형식은 DH{...}로, flag.bmp를 올바르게 복구하면 찾을 수 있습니다.

dreamhack.io

 

문제 파일

chal.py 파일

코드가 작성되어 있음

 

지피티한테 이 코드를 해석해달라고 함

-> 원본 BMP 파일의 헤더 부분을 강제로 0으로 덮어써서 "깨진 BMP 파일"을 만드는 코드

 

 

 

 

 

flag.bmp.broken 파일은 HxD로 열어봄

0x00 ~ 0x1B 구간 = 파일 헤더 + DIB 헤더 앞부분 → 전부 00으로 날아감

앞부분이 전부 00으로 채워져 있고, 그 뒤부터는 전부 FF 값으로 채워져 있음

 

 

일단 BMP 파일에 대해 찾아봄

BMP는 용량은 크지만 단순하고 화질 손실 없는 그림 파일 형식이라 함.

BMP 구조:

 

+------------------------+
| BITMAP FILE HEADER     | (14 bytes)
+------------------------+
| DIB HEADER             | (40~124 bytes, 버전에 따라 다름)
+------------------------+
| COLOR PALETTE (옵션)   | (비트 수가 8 이하일 때)
+------------------------+
| PIXEL DATA             | (이미지 실제 데이터)
+------------------------+
| (옵션 확장 영역)       |
+------------------------+

 

 

 

 

 

지피티한테 어떻게 다시 복구할 수 있는지 ( 어떤 헤더 필드를 살려야 정상적으로 열리는지 )

 

 

1. BITMAP FILE HEADER (0x00–0x0D)

 

0x00–0x01: "BM" = 42 4D

0x02–0x05: 파일 전체 크기 

0x06–0x09: 예약 = 00 00 00 00

0x0A–0x0D: 픽셀 데이터 시작 오프셋 = 36 00 00 00 (보통 54바이트 → 0x36)

 

 

 

 

 

2. DIB HEADER (0x0E–0x35)

 

0x0E–0x11: 28 00 00 00 (BITMAPINFOHEADER 크기 = 40)

0x12–0x15: 가로 픽셀 수 (width, 추정 필요)

0x16–0x19: 세로 픽셀 수 (height, 추정 필요)

0x1A–0x1B: 평면 수 = 01 00

0x1C–0x1D: 픽셀당 비트 수 (18 00 = 24bpp)

0x1E–0x21: 압축 방식 = 00 00 00 00 (BI_RGB)

0x22–0x25: 이미지 크기 ( 안 넣어도 무방 )

0x26–0x29: X 해상도 = 13 0B 00 00 (2835, 72dpi)

0x2A–0x2D: Y 해상도 = 13 0B 00 00

0x2E–0x31: 사용 색상 수 = 00 00 00 00

0x32–0x35: 중요한 색상 수 = 00 00 00 00

 

 

 

3. 픽셀 데이터 (0x36 이후)

  • 지금 보이는 FF FF FF ... 값이 그대로 이미지의 픽셀 값임 → 정상적으로 살아 있음.

 

 

 

 

 

즉.

파일 전체 크기, 그리고 width와 height를 알아내야함

 

 

 

파일 전체 크기는 14,309,622 바이트.

14,309,622 바이트 = 0x00 DA 58 F6 → 리틀엔디언: F6 58 DA 00

 

 

 0x1C–0x21(6바이트)도 알아야 함

0x1C–0x21 는 18 00 00 00 00 00

 

-> 24bpp + BI_RGB(무압축)

 

 

 

 

< width와 height 구하기 >

 

24bpp에서는 각 행 크기 row_size = ((3·width + 3) // 4) * 4(4바이트 패딩)

 

height = D / row_size가 정수가 되면 OK

 

width = 2184, height = 2184

  • 검증: 3 × 2184 × 2184 = 14,309,568 = D

 

 

0x12–15 : 88 08 00 00 (biWidth = 2184) 

0x16–19 : 88 08 00 00 (biHeight = 2184)

 

 

 

 

 

 

 

 

최종

확장자 bmp로 해서 저장

 

아 뭔가 잘못됨 

심각하게 보일듯 말듯함

 

아예 안 보이는 게 아니라서...

숨겨진 거 같음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'드림핵' 카테고리의 다른 글

[워게임] session-basic  (0) 2025.09.29
[드림핵] 워게임 WindowsPool  (0) 2025.08.25
[드림핵] 워게임 Enc-JPG  (3) 2025.08.05
[드림핵] 워게임 structure-based carving  (4) 2025.07.28
[워게임] sleepingshark  (1) 2025.07.21