PDF 파일구조
PDF : Protable Document Format의 약자. ISO 32000 오픈 포맷으로 표준화되어 있음.
1. PDF 구조
Header |
Body |
Cross Reference Table |
Trailer |
1) PDF Header (8 bytes) : PDF 시그니처와 문서의 버전 정보를 가지고 있음.
8byte로 이루어진 PDF 헤더는 PDF의 시그니처인 25 50 44 46 와 버전정보(1.0~1.7) 로 되어 있다.
아래 사진에서 버전은 1.3 으로 2D 31 2E 33 이다.
%PDF-1.3(PDF시그니처-버전)
PDF의 시그니처는 25 50 44 46 이고, PDF 버전은 그 뒤의 4 바이트이다.
Signature | PDF Version | HEX | Suppored by |
%PDF-1.0 | 1.0 | 25 50 44 46 2D 31 2E 30 |
Adobe Acrobat 1.x |
%PDF-1.1 | 1.1 | 25 50 44 46 2D 31 2E 31 |
Adobe Acrobat 2.x |
%PDF-1.2 | 1.2 | 25 50 44 46 2D 31 2E 32 |
Adobe Acrobat 3.x |
%PDF-1.3 | 1.3 | 25 50 44 46 2D 31 2E 33 |
Adobe Acrobat 4.x |
%PDF-1.4 | 1.4 | 25 50 44 46 2D 31 2E 34 |
Adobe Acrobat 5.x |
%PDF-1.5 | 1.5 | 25 50 44 46 2D 31 2E 35 |
Adobe Acrobat 6.x |
%PDF-1.6 | 1.6 | 25 50 44 46 2D 31 2E 36 |
Adobe Acrobat 7.x |
%PDF-1.7 | 1.7 | 25 50 44 46 2D 31 2E 37 |
Adobe Acrobat 8.x, 9.x, 10.x, ... |
2) Body : 실제 문서의 정보를 포함하는 오브젝트(객체)와 이 객체들을 구성하는 트리형태로 서로 링크
오브젝트의 시작은 'n1 n2 obj'로 시작하고, 'endobj'로 끝나는 것으로 오브젝트 영역을 구분한다. (n1, n2는 숫자)
2 0 obj
<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >>
endobj
3) Cross Reference Table (xref) : 각 객체들을 참조할 때 사용되는 테이블. 객체의 사용 여부와 식별 번호 등이 저장
Body에 존재하는 객체들의 위치값과 사용 여부를 기록. 공백을 포함하여 20바이트 크기
xref 라는 키워드를 가지고 있다. (Cross Reference table의 시작)
* Trailer에서 startref에 나와 있는 41871을 16진수로 바꾸면 > A38F로 해당 위치이다.
xref
0 31 // 엔트리 개수
0000000000 65535 f // 0번 오브젝트, offset 0, 사용되지 않음
0000041727 00000 n //1번 오브젝트, offset 41727, 사용됨
0000006843 00000 n
0000009828 00000 n
0000000022 00000 n
0000006823 00000 n
0000006947 00000 n
0000009792 00000 n
0000000000 00000 n
0000021920 00000 n
0000000000 00000 n
0000009961 00000 n
0000007056 00000 n
0000009771 00000 n
0000009911 00000 n
0000010793 00000 n
0000010257 00000 n
0000010773 00000 n
0000011033 00000 n
0000021898 00000 n
0000023081 00000 n
0000022346 00000 n
0000023061 00000 n
0000023316 00000 n
0000041474 00000 n
0000041496 00000 n
0000041571 00000 n
0000041623 00000 n
0000041646 00000 n
0000041688 00000 n
0000041707 00000 n
0번째부터 31번째 오브젝트까지 총 32개의 오브젝트에 대한 위치값과 사용여부가 표시된다.
문자는 해당 오브젝트 사용 여부를 나타낸다. f는 free entry(사용 안 함), n은 in-use entry(사용함)이다.
4) Trailer : 파일의 끝에 위치하여, File Body에 존재하는 객체 중 최상위(Root) 객체가 어떤 객체인지. Cross Reference Table이 어디에 위치하는지 기록되어 있음.
맨 앞의 헤더를 읽은 후 파일의 끝의 tailer를 확인하도록 포맷이 설계되어 있다고 한다.
tailer는 'tailer'라는 지시어로 시작하여 '%EOF'로 끝난다.
trailer
<< /Size 31 /Root 14 0 R /Info 1 0 R /ID [ <b14eeba237ef9988f4f35204afdb8604> <b14eeba237ef9988f4f35204afdb8604> ] >>
startxref
41871
%%EOF
<< ~ >> 는 현재 오브젝트의 속성을 표기
/Size : Cross reference Table 항목 수
/Prev : 이전 Cross reference Table 위치
/Root (Directory) : Root 객체의 번호 표시.
startxref 라는 키 지정이 가능. Cross reference Table의 위치값을 표현. 이후에 오는 값인 41871이 파일에서 Cross reference Table의 시작 오프셋.
[참고]
PDF 분석 프로그램 : PDFStream Dumper
기능 : 악성 PDF 문서 분석을 위한 무료 도구.
- 난독화된 자바스크립트
- 저수준 PDF 헤더 및 객체
- 쉘코드를 처리하기 위한 특수 도구
다운로드 링크 : http://sandsprite.com/blogs/index.php?uid=7&pid=57
[ 참조 ]
https://jacksimon86.tistory.com/m/96
https://panda2122.tistory.com/10