'll Hacker

[Dreamhack 워게임] structure-based carving writeup 본문

Hacking/Digital Forensic

[Dreamhack 워게임] structure-based carving writeup

씨이오가 되자 2025. 1. 30. 00:21
Contents
728x90

문제 설명

주어진 바이너리 파일에서 플래그를 찾아보세요!

힌트는 

압축 패스워드는 ZIP 구조 어딘가에...

입니다.

풀이

힌트를 보게 되면 zip 파일이라는 것을 알 수 있다. 

zip 구조 파악

zip 파일은 압축된 여러 개의 파일을 하나로 묶어 저장하는 형식이며, 내부적으로 여러 개의 파일 설명자와 중앙 디렉터리로 구성된다.

local file descriptors = 로컬 파일 설명자

zip파일에는 개별 파일이 저장되는데, 각각의 파일에는 다음 요소들이 포함된다.

  1. 로컬 파일 헤더(Local file Header) : 파일 정보(파일명, 압축 방식, 크기 등)를 저장한다.
  2. 압축 및 암호화된 데이터 : 파일의 실제 데이터가 압축 및 암호화된 형태로 저장된다.
  3. 옵션 데이터 설명자 : 일부 Zip 파일에서 사용되며, 데이터 길이 및 체크섬 정보를 포함한다.

데이터 설명자의 존재 여부는 로컬 파일 헤더의 플래그에 의해 결정된다.

 

Archive decryption header = file descriptors

PKZip 파일 버전 6.2 이상에서만 존재하는 헤더이다.

중앙 디렉터리가 암호화된 경우에만 포함된다. 암호화 방식과 관련된 정보를 저장한다.

Central Dirctory

zip파일의 마지막 부분에 위치하며, 전체 파일의 메타데이터를 저장한다. 개별 파일들의 로컬 파일 설명자 정보를 요약하고, 추가 속성 정보를 포함한다. 

포함 정보:

  • 파일 속성(파일크기, 시간, 날짜 등)
  • 파일 설명(comment)
  • 로컬 헤더(Local Header) 위치 정보
  • 다중 파일 아카이브(Multi-file Archive) 관련 정보

Central directory file header

End of central directory record

 

zip파일 동작 원리

1. End of Central Directory부터 시작

2. End of Central Directory에 존재하는 값인 Central Header Offset에 존재하는 Offset으로 이동하게 된다

3. 이 Offset은 Central Directory 시작 Offset으로 가게 된다.

4. Central Directory의 맨위부터 아래로 내려오면서 내부에 존재하는 Central Header의 개수를 구별하면서 Central Directory 에 존재하는 Local Header Offset에 들어있는 값을 확인한다.

5. 확인한 Local Header Offset의 값인 Local Header 시작 Offset으로 가게 된다.

6. Local Header Offset으로 간뒤 해당 File Data로 이동함으로써 zip파일 사용자가 zip파일 내부 압축 데이터를 확인할 수 있다.

 

 

따라서 zip 구조는 50 4B 03 04 라는 Signature로 시작하고, 패스워드를 이용해 압축된 Zip은 offset 0x6-0x7 값 중에서 Bit 0(encrypted file)이 1로 설정된다. 즉, 코드로 표현해보면 다음과 같다.

def isFlagZip(data, offset):
	condition1 = (data[offset:offset+4] == b'\x50\x4b\x03\x04')
	condition2 = (data[offset+6] & 1 == 1)
	if condition1 and condition2:
		return True
	else:
		return False

주어진 파일의 처음부터 조건을 만족하는 ZIP파일을 찾는 Python 스크립트를 실행시켜보면 해당 주소가 출력된다.

결과로 나온 주소부터 end of Central directory record 까지 드래그해서 hxd에서 파일을 새로 만들어서 붙여넣기 하면

암호화된 png파일을 볼 수 있다. 해당 zip파일의 central directory file header 구조의 extra field로 가면 패스워드가 숨겨져 있다.

 


참고

Dreamhack Digital Forensic Lecture loadmap

https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html

https://blog.forensicresearch.kr/3

 

728x90