본문 바로가기
분석 TIP/정적분석

HWP PS 파일 분석

by 두유노우컴퓨터 2025. 4. 15.

HWP 문서파일 내 구성파일 중 *.ps 파일이 존재하는 이는 PostScript 파일을 의미한다.

 

PostScript는 페이지 설명 언어로 문서의 레이아웃과 그래픽 등을 정의하는데 사용된다. HWP문서 파일을 열면 문서에 포함된 PostScript 파일도 같이 실행되며, 만약 악성 PS 스크립트가 같이 포함되었을 경우 스크립트를 통해 악성코드가 같이 설치 될 수 있다.

 

HWP 내의 OLE vs PS 차이는?

더보기

OLE 파일

 

Object Linking and Embedding (OLE) 기술을 사용하여 다른 응용 프로그램의 개체를 HWP 문서에 포함하거나 연결할 수 있다. 예를 들어, Excel 스프레드시트, Word 문서, 이미지 등을 HWP 문서에 삽입할 수 있다. OLE 파일은 주로 다양한 형식의 데이터를 통합하고, 문서 내에서 다른 응용 프로그램의 기능을 활용하는 데 사용된다.

 

PS 파일

 

PostScript (PS) 파일은 페이지 설명 언어로, 주로 문서의 레이아웃과 그래픽을 정의하는 데 사용된다. HWP 문서 내에 포함된 PS 파일은 고해상도의 그래픽과 이미지를 표현하거나, 문서의 인쇄 품질을 높이는 데 사용될 수 있다.

 

따라서, OLE 파일은 다양한 응용 프로그램의 데이터를 통합하고 문서 내에서 상호작용을 가능하게 하는 반면, PS 파일은 문서의 그래픽 요소와 인쇄 품질을 관리하는 데 중점을 둔다.

HWP내 PS vs EPS 차이는?

더보기

PS (PostScript)

 

PostScript는 페이지 설명 언어로, 문서의 레이아웃과 그래픽을 정의하는 데 사용된다. 주로 인쇄 품질을 높이기 위해 사용되며, 문서의 텍스트와 그래픽을 정확하게 표현할 수 있다.

 

EPS (Encapsulated PostScript)

 

Encapsulated PostScript는 PostScript의 하위 집합으로, 그래픽 파일 형식이다. EPS 파일은 독립적인 그래픽 요소를 포함할 수 있으며, 다른 문서에 쉽게 삽입될 수 있다. 주로 벡터 그래픽과 고해상도 이미지를 포함하는 데 사용된다.

 

따라서, PS 파일은 전체 문서의 레이아웃과 인쇄를 관리하는 데 중점을 두는 반면, EPS 파일은 독립적인 그래픽 요소를 다른 문서에 삽입하는 데 사용된다. HWP 문서에서 두 형식은 각각의 용도에 맞게 사용된다.

1. PS파일 확인

 

HWP 파일 내 PS파일을 확인하기 위해 아래와 같은 툴을 사용한다.

 

Malcat / SSView

Malcat에서 추출

 

2. 추출한 PS파일 압축해제

 

zlib으로 압축되어있는 형태로 아래 파이썬 코드를 통해 압축 해제 한다.

import zlib

indata = open( 'BIN0001.PS', 'rb' ).read()
outdata = zlib.decompress(indata, -15)

f = open('decompress_BINdata', 'wb')
f.write(outdata)
f.close()

 

3. PS 스크립트 해석 및 난독화 해제

 

난독화 스크립트를 해석하여 복호화 작업을 준비한다.

난독화 스크립트

 

난독화 스크립트 해석 진행하기

더보기

/Z999 < bindata> def
ㄴ Z999라는 이름으로 압축된 데이터를 정의한다. bindata는 실제 데이터가 들어갈 자리이다.

 

0 1 Z999 length 1 sub
ㄴ 루프를 설정한다. 0부터 Z999의 길이 - 1까지 반복한다.

 

{/Y31 exch 1 2 and pop def
ㄴ Y31이라는 변수를 정의하고, 현재 인덱스의 값을 설정한다. 1 2 and pop은 비트 연산을 수행한다.

 

Z999 dup Y31 get <key_value> Y31 15 and /Y104 8 def get xor Y31 exch put} for
ㄴ Z999의 현재 인덱스 값을 가져와서 <key_value>와 XOR 연산을 수행한 후, 다시 Z999에 저장한다. 이 과정은 데이터를 복호화하는 데 사용된다.

 

Z999 cvx
ㄴZ999를 실행 가능한 객체로 변환한다.

 

exec
ㄴ변환된 Z999 객체를 실행한다.

4. 복호화


key_value를 통해 bindata를 복호화하기 위해 툴을 써준다.
(bindata는 사전에 파일로 뽑아주자.)

FileInsight
CrypTool

 

키 값을 리틀엔디안 방식으로 바꾸기 귀찮으니 CrypTool를 바로 써준다.

 

(32비트값을 메모리에 저장될때 리틀엔디안(가장 작은 바이트 먼저 저장) 방식으로 저장된다. 0x12345678의 경우 0x78563412 이다. 그럼 IDA에서 해석할대는 메모리상(리틀엔디안으로)에서 메모리를 보여주므로 실제 XOR키 값을 쓸때는 원래대로 변환해서 사용해야지 제대로된 해석이 된다.)

 

xor 키 값 입력

 

xor변환 기능을 이용해 변환을 해주면 된다. PostScript도 보이고 밑에 바이트 스트림을 보자마자 분석을 조금이라도 해 본 사람이라면 쉘코드 인것을 알 수 있다. (함수의 시작에 주로 사용되는 스택 프레임 설정 어셈블리어 코드이다.)

쉘코드 확인

55                   push    ebp
8b ec                mov     ebp, esp
81 ec 8c 08 00 00    sub     esp, 0x88C      ; 스택에 0x88C(= 2188) 바이트 공간 확보
57                   push    edi

 

이제 해당 바이트 스트림을 IDA나 디버거로 열어서 분석을 진행하면 된다.

 

'분석 TIP > 정적분석' 카테고리의 다른 글

Visual Basic 6.0 샘플 분석  (0) 2025.04.18
PDF Deflate JavaScript 분석  (0) 2025.04.17
HWP OLE 파일 분석  (0) 2025.04.16
IDA 도구 활용  (0) 2025.04.09
IDA 파이썬 스크립트  (0) 2025.04.04