문제 설명
Something doesn’t seem quite right with this zip file.
Can you fix it and get the flag?
zip 파일에 문제가 있으니, 문제가 되는 부분을 고치고 flag를 얻으라고 한다.
그리고 문제 파일의 압축을 풀면 오류가 발생한다.

문제 풀이: zip 파일 구조
(참고: https://velog.io/@sooboon/ZIP-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0)
zip 파일은 크게 3개의 파일 구조로 이루어진다(Local File Header, Central Directory, End of Central directory record).

Local File Header
Local File Header는 압축 파일들에 대한 기본 정보를 포함한다.
| 필드 | 크기 | 설명 | 위치 |
| Signiture | 4 byte | 50 4B 03 04(리틀 엔디안 표기) = 0x04034b50(고유값) | 0x00 ~ 0x03 |
| Version | 2 byte | 14 00 | 0x04 ~ 0x05 |
| Flags | 2 byte | 02 00 | 0x06 ~ 0x07 |
| Comprssion method | 2 byte | 08 00 | 0x08 ~ 0x09 |
| File modification time | 2 byte | FC 99 | 0x0A ~ 0x0B |
| FIle modification date | 2 byte | 92 4A | 0x0C ~ 0x0D |
| Crc-32 checksum | 4 byte | 3E A9 2E 53/ 파일 내용의 오류 체크. 이 부분이 작성되지 않을 경우 압축 프로그램은 손상된 파일로 간주하고 압축 해제를 거부한다. | 0x0E ~ 0x11 |
| Compressed size | 4 byte | 46 00 00 00 = 0x00000046 = 79 | 0x12 ~ 0x15 |
| Uncompressed size | 4 byte | F6 00 00 00 = 0x000000F6 = 246 | 0x16~0x19 |
| File name length | 2 byte | 29 23 = 0x2329 = 9001 | 0x1A ~ 0x1B |
| Extra field length | 2 byte | 1C 00 = 0x001C = 28 | 0x1C ~ 0x1D |
| File name | 8 byte(여기서는)/가변 크기 | 00 00 00 00 00 00 00 00/ 상대 경로를 포함하는 파일의 이름 | 0x1E ~ 0x25(여기서는)/ 0x1E ~ 0x1E+파일 길이 |
| Extra filed | 가변 크기 | 이 필드는 헤더와 데이터 쌍으로 구성된다. |
Central Directory
Central Directory는 Local File Header의 확장 데이터 뷰를 제공한다. Local File Header에 포함된 데이터를 더하여 파일 속성, 구조에 대한 로컬 기준을 가진다.

| 필드 | 크기 | 설명 | 위치 |
| Signature | 4 byte | 50 4B 01 02 = 0x02014b50 | 0x88 ~ 0x8B |
| Version | 2 byte | ||
| vers. needed | 2 byte | ||
| Flags | 2 byte | ||
| Compression method | 2 byte | ||
| File modification time | 2 byte | ||
| File modification date | 2 byte | ||
| Crc-32 checksum | 4 byte | 파일 내용의 오류 체크 | |
| Compressed size | 4 byte | ||
| Uncompressed size | 4 byte | ||
| File name length | 2 byte | 29 23 = 0x2329 = 9001 | 0xA4 ~ 0xA5 |
| Extra field length | 2 byte | 18 00 = 0x0018 = 24 | 0xA6 ~ 0xA7 |
| ... | |||
| File name | (8 byte) | 00 00 00 00 00 00 00 00/ 상대 경로를 포함하는 파일의 이름 | 0xB6 ~ 0xBD |
| Extra field | (24 byte) | ||
| File comment |
Central Directory를 살펴보면 File name length의 길이는 9001인데, File name은 현재 8 바이트이다. 따라서 29 23 -> 08 00 이렇게 수정해주면 될 것 같다.

그랬더니 압축이 풀리긴 한다. 그런데 아까와는 조금 다른 오류가 발생한다.

"지정된 경로를 찾을 수 없습니다" 오류 해결 방법을 검색해봤다. 대부분 파일명 길이 제한 때문에 이런 오류가 발생한다고 한다. 하지만 우리가 살펴본 zip 파일의 파일명은 8byte 이기 때문에 여기서 문제가 발생하지는 않을것이다.
파일명이 적혀져있지 않아(00 00 00 00 00 00 00 00) 문제가 발생하는 것 같아 Local File Header와 Central Directory의 파일명을 8 바이트 문자열로 채웠다.

그랬더니 압축 풀기에 성공했고, flag.txt라는 텍스트 파일이 추출되었다.
Huzzah, you have captured the flag:
PCTF{f0rens1cs_yay}
'Wargame' 카테고리의 다른 글
| [Beginner] bof (0) | 2025.11.10 |
|---|---|
| [Beginner] Baby-BOF (0) | 2025.11.05 |
| Windows Search (0) | 2025.01.06 |
| Basic_Forensics_1 (0) | 2025.01.06 |
| session-basic[web] (0) | 2024.12.28 |
