악성코드 배포에 많이 사용되는 PDF 를 들어봤지만 왜 그럴까 하고 생각해보진 못했다. 이제야 조금 이해가 된다. 여러 객체가 물릴 수 있는 PDF 에 악성코드 코드를 심을 수도 있겠다는 ㅜㅜ


참고문헌

http://blog.naver.com/PostView.nhn?  

  blogId=hazycode&logNo=50128349644&redirect=Dlog&widgetTypeCall=true

- PDF Reference Sixth Edition by Adobe Systems Incorporated



1. PDF 를 구성하는 4가지 요소

1) Object

- PDF 문서는 여러 작은 데이터 오브젝트들로 구성된 모임


2) File Structure

- 파일 구조는 PDF 파일 내에 오브젝트들이 어떻게 저장되고 어떻게 접근되고 업데이트 되는지 결정.


3) Document Structure 

- 문서 구조는 여러 간단한 오브젝트들이 어떻게 PDF의  각 문서를 구성하고 배치되는지 설명


4) Content Streams

- 콘텐트 스트림은 PDF 문서의 외곽이나 그래픽 요소들을 묘사하는 일련의 명령들을 가지고 있다



2. 기본 오브젝트

- PDF 는 다음의 8가지 기본적인 오브젝트 타입을 지원하다.

1) Boolean 오브젝트

- true, false value

- 배열의 요소나 dictionary 의 엔트리 값으로써 사용될 수 있다.


2) Numeric 오브젝트

- 2가지 종류를 지원. 정수형, 실수형

- 정수형 : 123, +17, -98 등

- 실수형 : 34.5, +123.64, -.002, 0.0 등


3) String 오브젝트

- 문자 스트링은 () 괄호 안에 쓰여진다.

a) 문자 스트림

- 스트링이 너무 길다면 백슬러쉬(\)를 사용해서 하나의 라인으로 여러 라인으로 쓸 수 있다.


b) 16진수 스트링

- 16진수 스트링은 괄호 <, > 로 둘러싸인 16진수 아스키 문자로 이루어진다.

- 2개의 16진수가 짝을 이뤄 1바이트를 이룬다. 짝이 안 맞을 경우 맨 마지막은 0 으로 간주한다.

- <901FA> => 90, 1F, A0 로 구성된 3바이트 스트링


4) Name 오브젝트

- Name 오브젝트는 하나의 심볼로써 하나의 유일한 문자열이다.

- 똑같은 문자열의 다른 2개의 Name 오브젝트가 있을 순 없다.

- Name 오브젝트는 슬러쉬(/)로 시작된다. 슬러쉬는 name 의 일부로 취급되는 것이 아니라 지금부터

  Name 오브젝트가 시작된다는 것을 알리는 역할을 한다.

- 대문자와 소문자도 구별한다.

- 유효한 Name 예



5) Array 오브젝트

- 여타 다른 언어 문법의 배열과 달리 PDF 의 배열은 다양한 형태의 오브젝트 조합을 가질 수 있다, 즉 

  하나의 배열에 number 오브젝트가 들어갈 수 있고, string 오브젝트가 들어갈 수 있다.

- 배열은 괄호 [, ] 내의 연속된 오브젝트들로 쓸 수 있다. 예) [539 3.14 false (Ralph) /SomeName]


6) Dictionary 오브젝트

- Dictionary 오브젝트는 엔트리로 알려진 2개의 오브젝트들의 짝들의 연계 테이블이다.

- 첫번째 요소는 키(Key)이고 두번째 요소는 값(value)이다.

- Key 는 반드시 name 오브젝트야만 한다.

- Value 는 어느 종류의 오브젝트라도 상관없다. 심지어 value 가 또 다른 dictionary 일 수도 있다.

- 엔트리의 value 가 null 이라면 그 엔트리는 없는 것으로 간주한다.

- Dictionary 오브젝트는 <<, >> 사이에 key 와 value 쌍으로 나타난다.



7) Stream 오브젝트

- String 오브젝트와 같이 연속적인 바이트의 집단이다(이진 데이터)

- stream 오브젝트는 길이에 제한이 없는 반면 string 오브젝트는 제약이 있다.

- 상대적으로 크기가 큰 이미지 파일이나 페이지 구성 오브젝트는 이 stream 오브젝트로서 표현

- Stream 오브젝트는 dictionary 오브젝트와 그 뒤를 따라서 오는 키워드 stream 과 endstream 사이의

  여러 바이트들로 구성 되어져 있다.



- Dictionary 오브젝트 뒤에 오는 키워드 stream 은 반드시 carriage return 과 line feed 가 합쳐진 

   end-of-line 마커로 끝이 나야 한다.

- 그리고 이진 데이터들은 키워드 stream 과 endstream 사이에 위치하고 이 stream 오브젝트의

   dictionary 오브젝트의 엔트리 /Length 엔트리가 이 이진 데이터의 크기를 명시한다.

- 모든 stream 오브젝트에 같이 나오는 dictionary 오브젝트 중에 공통적인 엔트리가 몇몇 있는데 

   /Length 엔트리, /Filter 엔트리가 있다.

- /Filter 엔트리는 필터의 이름을 명시하고 필터는 여러 목적으로 사용될 수 있는 이진 데이터를

   해당 목적에 맞게 해석하는 역할을 한다.

- /Length 엔트리의 경우 필수적인 엔트리이고, /Filter 엔트리는 선택적인 엔트리이다.


8) 간접 오브젝트

- PDF 파일에서 레이블된 (이름이 붙여진) 오브젝트들을 간접 오브젝트라고 한다

- 간접 오브젝트는 오브젝트 고유의 식별자를 갖게 되며 다른 오브젝트는 이를 이용하여 이 오브젝트

  를 참조할 수 있다.

a) 오브젝트 수(양수)

- 간접 오브젝트는 보통 연속적으로 자기의 고유 숫자가 정해지지만 반드시 그런 건 만은

   아니다. 

b) 생성 수(0을 포함한 양수)

- 새로 생성된 간접 오브젝트는 생성 숫자로  0 을 받는다. 만약 나중에 파일이 업데이트 된다

   면 이 숫자는 변경될 수 있다.

- 간접 오브젝트의 정의는 우선 오브젝트 수가 오고 다음 생성 수 그리고 키워드 obj 와 endobj 로 둘러

   싸여진 오브젝트 값이 따라온다.

- 예



3. PDF 파일 구조

1) 표준 PDF 파일의 4가지 요소

a) PDF 명세 버전을 알리는 한 줄의 헤더

b) PDF 문서를 구성하는 오브젝트를 포함하는 body

c) 간접 오브젝트에 관한 정보를 가지고 있는 전역 참조(cross-reference) 테이블

d) 전역 참조의 위치와 body 내 특정 오브젝트의 위치 정보를 가지고 포하하고 있는 트레일러(trailer)




2) 파일 헤더

- PDF 1.7 버전을 따르는 파일의 경우 다음과 같을 수 있다. 예) %PDF- 1.7


3) 파일 body

- PDF 파일의 body 는 문서의 실질적인 내용을 담고 있는 간접 오브젝트들로 구성된다. 

- 이러한 오브젝트들은 문서의 내용, 폰트나 페이지, 이미지 등과 같은 요소를 나타낸다.


4) 전역 참조 테이블

- 전역 참조 테이블은 각 간접 오브젝트의 위치 정보를 가지고 있어, 특정 오브젝트를 찾기 위해 파일

  을 다 읽어야 하는 번거로움을 피하고 랜덤 엑세스를 가능하게 해준다.

- 각 전역 참조 섹션은 키워드 xref 를 포함하는 한 줄로 시작된다. 그 뒤로 1개 이상의 전역 참조 서브 

  섹션이 순서 없이 따라온다.

- 오브젝트 숫자는 0 부터 시작한다.

- 각 전역 참조 서브섹션은 연속된 오브젝트 숫자의 엔트리만을 포함한다. 각 서브섹션은 스페이스로 

  구분된 2개의 숫자로 시작되는데, 첫 숫자는 해당 서브섹션의 첫 번째 엔트리 오브젝트 숫자이고, 

  두번째 숫자는 해당 서브섹션이 포함하고 있는 엔트리 개수이다.

- 실제 파일 예



- 그 다음으로 한 줄씩 실질적인 간접 오브젝트의 위치 정보를 담고 있는 엔트리가 나온다. (위 그림에

  3번째, 4번째 빨간 밑줄)

- 각 엔트리는 정확히 20바이트 길이, end-of-line 마커를 포함

- 엔트리는 2가지 종류의 엔트리

a) 현재 사용중인 엔트리

b) 지워져서 사용되지 않는 엔트리



5) 트레일러

- PDF 파일의 트레일러는 파일 내 전역 참조 테이블과 특정 오브젝트를 빨리 찾게 해준다.

- 파일 트레일러 위치 



 - 트레일러 구조와 설명



- Prev 엔트리가 없으면 한 번도 업데이트가 되지 않았음을 추측할 수 있다.


6) 그 외 타입들

a) /Page

- 페이지를 나타낸다

b) /Encrypt

- DRM 기술이 적용되었거나

- 파일을 읽을 때 비밀번호가 필요하다는 것을 말한다.

c) /ObjStm

- Object Stream

- 다른 오브젝트에 사용될 수 있는 Object Stream

d) /JS

- JavaScript 가 사용되고 있음을 말한다.

e) /AA, /OpenAction

- 문서 또는 페이지가 오픈될 때 자동 실행되는 것이다

f) /JBig2Decode

- JBIG2 압축이 사용된 것을 말한다.

- 그 외 Standard Filter 에는 ASCIIHexDecode, ASCII85Decode, LZWDecode, FlateDecode, 

   RunLenghtDecode, CCITTFaxDecode, DCTDecode, 

g) /RichMedia

- 플래시(Flash)가 들어있음을 나타낸다.

h) /Launch

- 액션이 얼마나 실행되었는지를 나타낸다.


Posted by i kiss you
,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

고려대학교 정보보호대학원 입학하기까지 네이버 보안인 카페에서 페이스북에서 조언을 아낌없이 주었던 고려대학교 정보보호대학원 석사과정 22기, 박사과정 26기인 박정은 님이 BlackHat 2013 참석차 미국 라스베가스에 가서 구해다 준 "스타벅스 라스베가스 시티 머그컵"


다른 시티 머그컵에 비해 높이는 좀 낮은데 더 화려한 맛이 있다.


고맙습니다.




Posted by i kiss you
,

같은 팀 임원묵 과장이 코타카니발루 여행가면서 사다 준 머그컵

도시건 아니 보인다고 해서 말레이시아 국가명 적힌 컵으로 ^^




Posted by i kiss you
,