SONOTRI
  • Zipper
    2025년 01월 10일 21시 56분 16초에 업로드 된 글입니다.
    작성자: sonootri

    문제 설명

    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}

     

     

     

    댓글