Plaid CTF 2017 - zipper

Something doesn’t seem quite right with this zip file.

Can you fix it and get the flag?

문제 파일 (zipper.zip)

zip파일 헤더에 관한 문제다.
먼저 unzip명령어를 사용하여 압축해제를 시도해보기로 했다.

filename이 길고 central에 bad extra field length라고 되어있다.

이번 풀이에 도움이 되는 글 ( https://www.mql5.com/en/articles/1971 )


풀이법 1

먼저 해당 zip파일이 DEFLATE 알고리즘을 사용하여 압축되었다고 해보자.
또한 파일 압축 크기에 해당하는 header 부분은 손상되지 않았다고 가정한다.

현재 46 00 00 00 이므로 현재 압축된 크기는 0x46바이트이다. 그렇다면 다음이 실제 Zip data 부분이 된다는 것을 알 수 있다.

DEFLATE 알고리즘을 가정하였으니 이 부분만 따로 저장하여 zlib으로 decompress 해주면 된다.


풀이법 2

이번엔 직접 zip파일을 압축 해제 가능하게 바꿔보자.
위 풀이법에서 compressed data는 0x46 바이트인것을 확인했다.

zip 파일의 앞부분 조금을 가져왔다. 이제 분석해보자.
46 00 00 00 은 앞서 말했듯이 우리가 압축하고난 결과가 0x46바이트라는 것이다.
F6 00 00 00 은 원본 데이터가 0xf6 바이트였다는 것이다.
29 23 은 파일이름이 0x2329바이트 라는 것이다. (???????? 여기서 이상함을 느껴야 한다.
1C 00 은 Extra Field의 길이가 0x1c 바이트 라는 것이다.
53 50 20 ~~~~~ 28 01 00 은 앞에서 압축 데이터의 크기가 0x46이라고 했던 부분. 즉 실제 파일의 압축된 내용부분이다.
이 부분은 50 4B 01 02 (Central directory header)이 부분 전부터 0x46바이트 만큼 가져온 것이다.
00 00 00 00 00 00 00 00 55 54 09 00 03 5B C8 F6 58 5B C8 F6 58 75 78 0B 00 01 04 E8 03 00 00 04 E8 03 00 00 이 부분이 file name + extra field다. 이 부분이 중요하다.
일단 파일 이름이 괴상한건 둘째치고 파일 이름이 0x2923바이트라고 했는데 0x24 밖에 안된다.

자 이제 복구해보자. 실제로 복구한 방법은 다음과 같다.

  1. 24 00 00 00 로 바꿨다. file name을 0x24byte라고 명시해주었고 extra field는 0바이트로 했다.
  2. 61 은 파일 이름을 a로 바꿔준 것이다. 사실 뒤 0x23바이트까지 모두 파일 이름이 있는 영역이지만 바로 뒤에 00 즉, null 문자가 있기 때문에 상관이 없었다.
  3. 20 00 00 00 이 부분은 central header 부분의 file name, extra field 부분이다. 근데 저기 바로 밑 61이 시작 되는 부분에서 50 4B 05 06 까지의 영역이 파일 이름인데 0x20밖에 안된다. 그래서 영역을 0x20으로 잡아주었다.
  4. 61 은 파일 이름을 a로 바꿔준 것이다.
Share