ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Digital Forensic Challenge 2019 AF100 문제 풀이
    $ 포렌식 $/$ 포렌식 문제 풀이 $ 2019. 11. 12. 10:51

     

    ZIP 파일에서 숨겨져 있는 데이터를 찾는 문제인것 같습니다.

     

    일단 ZIP 파일이 어떻게 구동되는지 원리를 이해해 보겠습니다.

    * zip 파일을 실행하면 실행되는 순서는 대략적으로 아래와 같이 나타낼 수 있다.

    1. 최초 실행시에 End of Central Directory로 이동.

    2. End of Central Directory 에 있는 정보를 바탕으로 Central Directory 의 시작 위치로 이동합니다.

    3. Central Directory 에서 정보를 읽고  End of Central Directory에서 Central Directory의 개수만큼 반복하여 End of Central Directory전까지 읽는다.

    4. Central Directory에서 읽은 Local Header 위치로 차례대로 접근한다.

    5. Local Header에서 정보를 읽고 해당되는 File Data를 압축해제한다.

    6. 6 ~ 7 Local Header의 개수 만큼 반복한다.

     

    위의 사진으로 zip 파일의 내부 구조를 설명 할 수 있습니다.

     

    zip파일에는 총 3개의 시그니처가 존재 합니다.

     

    Local Header 서명 : 50 4B 03 04

    Central Header 서명 : 50 4B 01 02

    End of Central Header 서명 : 50 4B 05 06 

     

    ZIP 파일 안에 들어있는 파일이 총 3개라면 

    각각 모든 시그니처가 3개씩 들어있게 됩니다.

     

    압축 파일의 개수 만큼 Local Header가 적혀 있고 그 뒤에 Central Header 인 50 4B 01 02 즉, 실제로 압축 해제할 파일 이름이 적혀 있습니다.

     

    1. Local File Header(30byte: 가변값 제외)

    local file header signature – 4 bytes – (0x04034b50) : 고유 값

    version needed to extract – 2 bytes

    general purpose bit flag – 2 bytes

    compression method – 2 bytes

    last mod file time – 2 bytes

    last mod file date – 2 bytes

    crc-32 – 4 bytes

    compressed size – 4 bytes

    uncompressed size – 4 bytes

    file name length – 2 bytes

    extra field length – 2 bytes

    file name (variable size)

    extra field (variable size)

     

    2. Central File Header(46byte: 가변값 제외)

    central file header signature – 4 bytes – (0x02014b50) : 고유 값

    version made by – 2 bytes

    version needed to extract – 2 bytes

    general purpose bit flag – 2 bytes

    compression method – 2 bytes

    last mod file time – 2 bytes

    last mod file date – 2 bytes

    crc-32 – 4 bytes

    compressed size – 4 bytes

    uncompressed size – 4 bytes

    file name length – 2 bytes

    extra field length – 2 bytes

    file comment length – 2 bytes

    disk number start – 2 bytes

    internal file attributes – 2 bytes

    external file attributes – 4 bytes

    relative offset of local header 4 bytes

    file name (variable size)

    extra field (variable size)

    file comment (variable size)

     

    3. End Header(22byte: comment 제외)

    end of central directory signature – 4 bytes – (0x06054b50) : 고유값

    number of this disk – 2 bytes

    number of the disk with the start of the central directory – 2 bytes

    total number of entries in the central directory on this disk – 2 bytes

    total number of entries in the central directory – 2 bytes

    size of the central directory – 4 bytes

    offset of start of central directory with respect to the starting disk number – 4 bytes

    .ZIP file comment length – 2 bytes

    .ZIP file comment (variable size)

     

    위와 같이 ZIP파일의 각각 바이트를 가지고 있습니다.

     

    문제를 열어보면 아래와 같습니다.

     

    m20190501.zip 파일과 보고서 파일이 있습니다.

     

    m20190501.zip 파일을 분석하면 되는 것 같습니다.

    파일 구조 분석에 효과적인 010 editor를 이용해서 확인해 보면 아래와 같습니다.

     

    ZIPFILERECORD는 총 5개가 있는데 ZIPDIRENTRY는 4개 밖에 없는것으로 보아 Frperg Qbphzrag 파일이 ZIPFILERECORD에는 있지만 ZIPDIRENTRY 에는 없어서 아래와 같이 ZIP 압축 해제 할때 나오지 않은 것으로 확인이 됩니다. (파일의 구조상 ZIPFILERECORD 보다 ZIPDIRENTRY를 먼저 읽는다.)

     

     

    그래서 은닉된 데이터는 Frperg Qbphzrag 파일이라는 것을 알수 있고 복구를 해서 파일을 추출 하겠습니다.

     

    파일을 복구하기 위해서 올바르게 놓여져 있는 7z1900.exe를 확인해 보겠습니다.

    ↑ ZIPFILERECORD

     

    ↑ ZIPDIRENTRY

     

    ZIPDIRENTRY에는 있지만 ZIPFILERECORD에는 없는 것을 확인해 보면 아래와 같습니다.

    - VersionToExtract

    - FileCommentLength

    - DiskNumberStart

    - InternalAttributes

    - ExternalAttributes

    - HeaderOffset

     

    위 6가지 항목만 찾으면 ZIPDIRENTRY를 복구할 수 있습니다.

     

    Frperg Qbphzrag의 ZIPFILERECORD를 바탕으로 복구를 해보겠습니다.

     

    - VersionToExtract : 압축 해제시에 필요한 값인 20을 넣어주면 된다.

     

    - FileCommentLength : 주석은 넣지 않아도 되기 때문에 0을 넣어준다.

     

    - DiskNumberStart : 거의 항상 0이다.

     

    - InternalAttributes : 

    => Bit 0 , Bit 1 , Bit 2 , Bit 3~16 의 종류를 가지고 있다.

    Bit 0 : apparent ASCII/text file

    Bit 1 : reserved

    Bit 2 : control field records precede logical records

    Bit 3~16 : unused

     

    이 파일은 시크릿 멀티미디어 파일일 가능성이 크기 때문에 Bit 0에 가깝다.

     

    - ExternalAttributes : 대부분 host system에 의존하는 값이기 때문에 다른 파일에서는 32라는 값을 가졌기 때문에 32라는 값 넣기.

     

    - HeaderOffset : Frperg Qbphzrag 파일의 Local Header의 시작 offset 주소를 넣는다.

    1CCC70이라는 값을 넣는다.

     

    다른 파일들과 달리 이 파일은 ExtraField가 있다.

     

    ExtraField은 FileName바로 밑에 배치 되기 때문에 그대로 복사해서 옮겨 주면 될것 같습니다.

     

    위의 규칙대로 파일을 복구해 보면 아래와 같은 hex값을 복구할 수 있다.

     

     

    해당 값을 ZIPDIRENTRY dirEntry[2] 아래에 넣어 줍니다!

     

    ZIP파일을 열어보면 아래와 같이 파일이 5개가 된것을 확인 할 수 있습니다.

     

    Frperg Qbphzrag파일의 확장자가 없는 것으로 보아 HxD를 이용해서 파일 헤더 시그니처를 확인해 보면 아래와 같습니다.

     

     

    7z 파일인것으로 보이네요

     

    열어 보려고 하니까 비밀 번호가 필요 하다고 합니다.

     

    아까 위에서 특정 문자열을 보았습니다.

    Frperg Qbphzrag.ROT139tBcZXF8X7^nMcYd

     

     

    NULL 인것으로 보아 구분을 지은 것 같아 보입니다.

     

    뒤의 문자열을 보면 ROT13 과 9tBcZXF8X7^nMcYd 로 구분을 지을 수 있는데 

    파일 이름을 rot13으로 돌려보면 아래와 같이 나옵니다.

     

     

    Frperg Qbphzrag -> Secret Document 라고 변환이 되네요

     

    그러면 9tBcZXF8X7^nMcYd를 비밀 번호를 사용해 보겠습니다.

     

     

    압축이 풀렸고 Secret Document.jpg가 있습니다.

     

    해당 사진의 md5 해시값을 알아보겠습니다.

     

    MD5 : a4f2256ffde2c69aa04820c6d80000b4

    댓글

Designed by Tistory.