STUDY.md
  • Windows PDF File Format Structure 공부
    2024년 09월 01일 18시 25분 40초에 업로드 된 글입니다.
    작성자: 방세연

     

    처음에 조금 긴가민가 했던 점이 문서형 악성코드를 공부해야할 것인지, 아니면 Windows 이미지 뷰어, pdf 뷰어 자체에서 악의적인 코드가 실행되거나 뷰어 자체에서 발견되는 취약점을 공부해야할 것인지였다.

     

    생각해보면 후자에 가까울 것 같고.. 문서 파일에 악성코드를 삽입하는게 아니라 뷰어 자체에 취약점이 발견될 수 있는지를 공부해보기로 했다.

     

    png 파일과 jpeg 파일 구조는 이곳에서 다뤄본 적이 있으니 일단 pdf 파일 포맷에 대해 적어보겠다.

    https://spacefriend.tistory.com/48

    https://spacefriend.tistory.com/49


     

    PDF 파일 분석을 위해 pdf 파일 하나를 만들어보았다.

     

    pdf 파일을 텍스트 앱에서 열거나 분석을 위한 Hex 툴 등을 이용하면 다음과 같은 내용을 확인할 수 있다.

    이 내용이 바로 PDF 파일에 대한 구조이다!

    이 내용에서 각 구조별로 하나씩 파악해보면서 분석을 진행해보겠다.

     

    pdf 구성 요소에 대한 전체 내용을 확인하고 싶다면 접은 글을 펼쳐보자.

    보기 쉽도록 깨지는 부분과 일부를 제거했으므로 양해 바란다.

     

    더보기
    %PDF-1.7
    1 0 obj
    <</Type/Catalog/Pages 2 0 R/Lang(ko) /StructTreeRoot 27 0 R/MarkInfo<</Marked true>>/Metadata 65 0 R/ViewerPreferences 66 0 R>>
    endobj
    2 0 obj
    <</Type/Pages/Count 2/Kids[ 3 0 R 24 0 R] >>
    endobj
    3 0 obj
    <</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 12 0 R/F3 14 0 R/F4 19 0 R/F5 21 0 R>>/ExtGState<</GS10 10 0 R/GS11 11 0 R>>/XObject<</Image23 23 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>>
    endobj
    4 0 obj
    <</Filter/FlateDecode/Length 622>>
    stream
    
    endstream
    endobj
    5 0 obj
    <</Type/Font/Subtype/Type0/BaseFont/BCDEEE+Paperlogy-8ExtraBold/Encoding/Identity-H/DescendantFonts 6 0 R/ToUnicode 56 0 R>>
    endobj
    6 0 obj
    [ 7 0 R] 
    endobj
    7 0 obj
    <</BaseFont/BCDEEE+Paperlogy-8ExtraBold/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 8 0 R/FontDescriptor 9 0 R/W 58 0 R>>
    endobj
    8 0 obj
    <</Ordering(Identity) /Registry(Adobe) /Supplement 0>>
    endobj
    9 0 obj
    <</Type/FontDescriptor/FontName/BCDEEE+Paperlogy-8ExtraBold/Flags 32/ItalicAngle 0/Ascent 978/Descent -200/CapHeight 767/AvgWidth 1041/MaxWidth 2510/FontWeight 800/XHeight 250/StemV 104/FontBBox[ -569 -200 1941 767] /FontFile2 57 0 R>>
    endobj
    10 0 obj
    <</Type/ExtGState/BM/Normal/ca 1>>
    endobj
    11 0 obj
    <</Type/ExtGState/BM/Normal/CA 1>>
    endobj
    12 0 obj
    <</Type/Font/Subtype/TrueType/Name/F2/BaseFont/BCDFEE+Paperlogy-8ExtraBold/Encoding/WinAnsiEncoding/FontDescriptor 13 0 R/FirstChar 32/LastChar 32/Widths 59 0 R>>
    endobj
    13 0 obj
    <</Type/FontDescriptor/FontName/BCDFEE+Paperlogy-8ExtraBold/Flags 32/ItalicAngle 0/Ascent 978/Descent -200/CapHeight 767/AvgWidth 1041/MaxWidth 2510/FontWeight 800/XHeight 250/StemV 104/FontBBox[ -569 -200 1941 767] /FontFile2 57 0 R>>
    endobj
    14 0 obj
    <</Type/Font/Subtype/Type0/BaseFont/BCDGEE+NanumSquare_acR/Encoding/Identity-H/DescendantFonts 15 0 R/ToUnicode 60 0 R>>
    endobj
    15 0 obj
    [ 16 0 R] 
    endobj
    16 0 obj
    <</BaseFont/BCDGEE+NanumSquare_acR/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 17 0 R/FontDescriptor 18 0 R/W 62 0 R>>
    endobj
    17 0 obj
    <</Ordering(Identity) /Registry(Adobe) /Supplement 0>>
    endobj
    18 0 obj
    <</Type/FontDescriptor/FontName/BCDGEE+NanumSquare_acR/Flags 32/ItalicAngle 0/Ascent 850/Descent -255/CapHeight 850/AvgWidth 455/MaxWidth 1231/FontWeight 400/XHeight 250/StemV 45/FontBBox[ -70 -255 1161 850] /FontFile2 61 0 R>>
    endobj
    19 0 obj
    <</Type/Font/Subtype/TrueType/Name/F4/BaseFont/BCDHEE+NanumSquare_acR/Encoding/WinAnsiEncoding/FontDescriptor 20 0 R/FirstChar 32/LastChar 32/Widths 63 0 R>>
    endobj
    20 0 obj
    <</Type/FontDescriptor/FontName/BCDHEE+NanumSquare_acR/Flags 32/ItalicAngle 0/Ascent 850/Descent -255/CapHeight 850/AvgWidth 455/MaxWidth 1231/FontWeight 400/XHeight 250/StemV 45/FontBBox[ -70 -255 1161 850] /FontFile2 61 0 R>>
    endobj
    21 0 obj
    <</Type/Font/Subtype/TrueType/Name/F5/BaseFont/TimesNewRomanPSMT/Encoding/WinAnsiEncoding/FontDescriptor 22 0 R/FirstChar 32/LastChar 32/Widths 64 0 R>>
    endobj
    22 0 obj
    <</Type/FontDescriptor/FontName/TimesNewRomanPSMT/Flags 32/ItalicAngle 0/Ascent 891/Descent -216/CapHeight 693/AvgWidth 401/MaxWidth 2614/FontWeight 400/XHeight 250/Leading 42/StemV 40/FontBBox[ -568 -216 2046 693] >>
    endobj
    23 0 obj
    <</Type/XObject/Subtype/Image/Width 720/Height 720/ColorSpace/DeviceRGB/BitsPerComponent 8/Filter/DCTDecode/Interpolate true/Length 52818>>
    stream
    
    endstream
    endobj
    57 0 obj
    <</Filter/FlateDecode/Length 2585/Length1 73684>>
    stream
    
    endstream
    endobj
    62 0 obj
    [ 0[ 910]  1[ 250]  32[ 520]  1175[ 860]  1224[ 860]  1257[ 860]  1523[ 860]  2053[ 860]  2190[ 860]  2299[ 860]  2439[ 860]  2444[ 860]  2504[ 860]  2507[ 860]  2563[ 860]  2573[ 860]  2616[ 860]  2633[ 860]  2643[ 860]  2771[ 860] ] 
    endobj
    63 0 obj
    [ 250] 
    endobj
    64 0 obj
    [ 250] 
    endobj
    65 0 obj
    <</Type/Metadata/Subtype/XML/Length 3085>>
    stream                                                                                         
                                                                                                        
    </rdf:RDF></x:xmpmeta><?xpacket end="w"?>
    endstream
    endobj
    66 0 obj
    <</DisplayDocTitle true>>
    endobj
    endstream
    endobj
    xref
    0 68
    0000000027 65535 f
    0000000017 00000 n
    0000000163 00000 n
    0000000226 00000 n
    0000000567 00000 n
    0000001263 00000 n
    0000001406 00000 n
    0000001434 00000 n
    0000001604 00000 n
    0000001677 00000 n
    0000001931 00000 n
    0000001985 00000 n
    0000002039 00000 n
    0000002221 00000 n
    0000002476 00000 n
    0000002616 00000 n
    0000002646 00000 n
    0000002814 00000 n
    0000002888 00000 n
    0000003135 00000 n
    0000003312 00000 n
    0000003559 00000 n
    0000003731 00000 n
    0000003968 00000 n
    0000056966 00000 n
    0000057243 00000 n
    0000057467 00000 n
    0000000028 65535 f
    0000000029 65535 f
    0000000030 65535 f
    0000000031 65535 f
    0000000032 65535 f
    0000000033 65535 f
    0000000034 65535 f
    0000000035 65535 f
    0000000036 65535 f
    0000000037 65535 f
    0000000038 65535 f
    0000000039 65535 f
    0000000040 65535 f
    0000000041 65535 f
    0000000042 65535 f
    0000000043 65535 f
    0000000044 65535 f
    0000000045 65535 f
    0000000046 65535 f
    0000000047 65535 f
    0000000048 65535 f
    0000000049 65535 f
    0000000050 65535 f
    0000000051 65535 f
    0000000052 65535 f
    0000000053 65535 f
    0000000054 65535 f
    0000000055 65535 f
    0000000000 65535 f
    0000058559 00000 n
    0000058913 00000 n
    0000061588 00000 n
    0000061715 00000 n
    0000061742 00000 n
    0000062155 00000 n
    0000067472 00000 n
    0000067727 00000 n
    0000067754 00000 n
    0000067781 00000 n
    0000070949 00000 n
    0000070994 00000 n
    
    trailer
    <</Size 68/Root 1 0 R/Info 26 0 R/ID[<6F4893E3DF7ED2469ABF285A79D498CB><6F4893E3DF7ED2469ABF285A79D498CB>] >>
    startxref
    71401
    %%EOF

     

     


     PDF 파일의 구조 

    출처 - https://ironmoon.net/2020/05/01/Understanding-PDF-Files.html#

     

    PDF(Protable Document Format) 파일은 Header, Body, xref Table, Footer 구성이 나타난다.

     

    주요 특징은 다음과 같다.

    • ASCII 포맷 파일이며 text 편집기에서 열고 읽을 수도 있다.
    • 확장자를 txt로 변경하고 Hex 데이터를 열람하면 pdf 파일 구조를 쉽게 확인할 수 있다.
    • ✨ https://opensource.adobe.com/dc-acrobat-sdk-docs/ 에서 더 많은 정보를 확인할 수 있다.
    file structure object의 접근, 저장, 업데이트 구조를 담당함
    (혹은 PDF format 파싱을 위한 모든 데이터)
    document structure object의 배치, 구성 구조를 담당함
    (PDF BODY의 내용을 기술하는 의미를 가짐)

     


     

     

    PDF Header 

    header에서는 pdf 버전을 확인할 수 있다.

    %PDF-(버전) ... 형태로 나타난다.

     

    25 50 44 46

    공통 시그니처다. pdf의 버전에 따라서 Acrobat Version이 결정된다.

     

     


    PDF Body 

    PDF 파일의 구성 요소인 Object, Structure, stream에 대한 이해가 필요하다.

    문서에 나타나는 폰트, 페이지, 이미지와 같은 내용 요소를 확인할 수 있는 부분이다.

     

     

     

    pdf 문서는 root인 Document Catalog부터 트리 계층 구조를 이루고 있다.

     

     

    object 여러개의 작은 데이터를 칭함

    1. Boolean Values
    (True, False 값을 가짐)
    2. Integer and real numbers
    (정수형 int, 실수형 float, double 두 가지 형태 지원)
    3. Strings
    ( 괄호 안에 쓰여지며, 문자형, 16진수 아스키 문자형 두 가지 형태 지원 )
    4. Names
    (단독 symbol로서 이름이 중복될 수 없다.)
    5. Arrays
    (배열 안에 연속된 여러 개의 오브젝트 작성 가능하다.)
    6. Dictionary
    (2개의 object 연계한 테이블로 Key 값과 Value 값으로 구성된다.
    Key는 Name 오브젝트를 가지고 있다.)
    7. Streams
    (strings object에 비해 크기가 큰 파일이나 object를 표현할 수 있다.)
    8. The null object
    Content Streams 그래프, 외곽 등의 요소 출력하는 명령들

     

     

     

    1 0 obj
    <</Type/Catalog/Pages 2 0 R/Lang(ko) 
    /StructTreeRoot 27 0 R/MarkInfo<</Marked true>>
    /Metadata 65 0 R/ViewerPreferences 66 0 R>>
    endobj

    이 Document Catalog에 대한 규칙이 있는데, /Type, /Pages, /Kids, /Count 등을 정의할 때 지켜야 하는 위치, 설계 등이 존재한다.

     

    기본적으로 각각 오브젝트는 << >> 형태로 구성되어 있으며 이 기호를 통해 서로를 구분한다. 

     


     

    PDF xref Table (Cross-Reference Table) 

    Cross - Reference를 의미한다.

    간접 오브젝트에 대한 전역 참조 테이블이다.

    오브젝트가 방대할 때 이를 찾기 용이하기 위해 xref table이 존재한다.

     

    PDF 파일 구조, 문서 내 객체 위치를 관리한다.

    < >.xref. <객체 개수>
    62 6A 0A 78 72 65 66 0A

    xtef 시작 태그 부분으로 Hex값이 시작된다. 뒤 부분에는 객체의 개수를 표시한다.

     

    xref
    0 68
    0000000027 65535 f
    0000000017 00000 n
    0000000163 00000 n

     

    • 시작하는 개체 번호는 0이며, xref 테이블이 다루는 개체의 수는 68개다. ( 0번 ~ 67번 )
    • 0번 개체는 파일의 27번째 바이트에 위치하며, f (65535)는 사용하지 않는 개체라는 뜻이다.
    • 1번째 개체는 파일의 17번째 바이트에 위치하며, n (00000)은 개체가 사용 중이라는 뜻이다.
    • ...

     

    즉, 각각의 개체가 사용 중인지, 혹은 사용하지 않는 개체거나 삭제된 개체인지를 설명하고 있다.

     

     


     

    ⭐PDF Footer 

    pdf Footer에는 Trailer가 존재한다.

    Trailer에는 Xref Table이 어디에 의치하는지, 특정 오브젝트가 어디에 있는지, 객체 등을 탐색한다.

    (이때 Trailer는 PDF 요소 내용에서 여러 개 존재할 수 있다. 또한 파일이 수정이 될 경우 초기 trailer 뒤에 덧붙이는 형태이다.)

    ( + Trailer는 아예 존재하지 않을 수도 있다. )

    trailer
    <<
    /Size 68
    /Root 1 0 R
    >>
    startxref
    72918
    %%EOF

    1번 오브젝트에서부터 문서가 시작된다.

    start xref (참조테이블 시작) 위치가 72918로 지정이 되어 있다.

     

     

    Trailer에는 다양한 엔트리 정보가 나열된다. 엔트리 정보는 다음과 같으니 참고해보자.

    /Key
    /Prev
    /Root
    /Page
    /Encypt
    /ObjStm
    /JS
    /OpenAction
    /RichMedia

     

    댓글