PDF 문서 포렌식 실습 [1]

2023. 9. 11. 11:46보안/CTF

아래 Top_Secret_Schedule.pdf를 보면 pdf파일이 여느 pdf파일과 내용과 pdf크기가 다른 것을 볼 수 있다. 문서포렌식 기법을 통해 아래 pdf파일의 원문을 알아가는 실습을 진행해 보려 한다.

Top_Secret_Schedule.pdf
0.07MB


포렌식을 진행하기 앞서 pdf파일을 hex editor로 열어보았다.

맨 첫번쨰 줄을 통해 pdf 파일이라는 것은 알겠지만 pdf문서구조를 잘 몰라서 그런지 잘 읽히지 않는다.

문서포렌식에 있어서 문서의 구조는 굉장히 중요하다고 한다. 정형화된 문서구조와 다른 입력값이 있을수록 임의로 변형되었을 확률이 높기 때문이다.

이번 기회를 통해 pdf문서구조를 공부해보자!

Header
Body 
Cross Reference Table
Trailer

1. Header

PDF 시그니처와 문서버전 정보를 가지고 있다.

%PDF는 25504446, 1.3버전은 2D312E33 16진수로 나타납니다. 

번외로 PDF는 여려 버전이 있으니 버전마다 값이 달라지겠죠?

2. Body

문서 정보를 포함하고 있는 부분입니다. obj(객체)와 객체들을 구성하는 요소가 트리형태로 뒤에 나열되어 있습니다. 

드레그 되어 있는 부분을 살펴보면 각 obj가 a, b, obj로 시작하여 endobj로 끝나는 것을 볼 수 있습니다. a, b는 숫자로 위객체에서는 3 0으로 표시되어 있네요

3. Cross Reference Table(xref)

각 개체들의 참조값을 저장하고 있습니다. 객체의 사용 여부, 식별 번호를 저장합니다. 공백을 포함하여 20바이트 크기를 가지고 있습니다.

엔트리 넘버는 0 34이고

0번 오브젝트는 0000000000 65535 f (offset 0)

1번 오브젝트는 0000000948 00000 n (offset 948)

로 나오네요...

4. Trailer

마지막 trailer 부분은 최상위층 루트의 객체 번호, cross reference table의 개수와 위치를 포함하고 있다.

/Size 33 : 현재 cross reference table의 개수가 33개이다.

/Root 19 0 R : 현재 루트 객체의 번호

startxref 72005: 현재 cross reference table의 위치, offset값은 72005dlek.

%%E0F으로 끝.


pdf 문서 구조를 알았다! 하지만 아직 pdf 파일의 어느부분이 잘못되었는지 감이 오지 않는다. 

그래서 그냥...쭉 읽었다.(맨 땅의 헤딩)

1. font값에 고객 이름정보

/BaseFont / mycustomernameisNoliardaski

fonttype에 고객 이름이 적혀있었다. 해당 obj 말고도 다른 obj에서도 font값이 동일하게 나타났다.

--> customer name : Noliardaski

 

2. javascript

xref 위에 javascript가 있었다! 

찾았는데...어떻게 내용을 알 수 있을지 헤메던 도중 문제를 해결하신 분이 'x\x9c'가  hex로 78 9c, 즉 데이터가 zlib로 쓰인 파일이라 알려주셨다. (감사합니다)

후다닥 zlib 라이브러리로 decompress한 결과...

b'Please remember.. the place is 240, Olympic-ro, Songpa-gu, Seoul at 11AM see you at the hotel'

결과가 나왔다 :)

 

마지막은 도저히 감이 잡히지 않아 다른 분의 해설을 참고했다. 

pdf size가 본래 pdf 사이즈와 다른 것을 보아 그 부분을 집중적으로 보라고 말씀해주셨고... page와 pages 값을 위주로 차이점을 찾았다.

<< /Type /Page /Parent 2 0 R /Resources 4 0 R /Contents 3 0 R /MediaBox [0 0 100 100]>>

<< /Type /Page /Parent 2 0 R /Resources 15 0 R /Contents 14 0 R /MediaBox[0 0 100 100] >>

<< /Type /Pages /MediaBox [0 0 595 842] /Count 2 /Kids [ 1 0 R 13 0 R ] >>

<< /Type /Catalog /Pages 2 0 R >>

Page와 Pages의 MediaBox 값이 달라서 두 MediaBox 를 동일하게 만들어 보았다.

[0 0 100 100] --> [0 0 595 842]

로 바꾼 후 pdf로 저장하였더니 문서가 보인다.