日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【翻译】PDF格式详解

發布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【翻译】PDF格式详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.簡介

我們都知道,攻擊者將一些shellcode包含在PDF文檔中有許多攻擊,這些攻擊使用某種漏洞來分析PDF文檔并將其呈現給用戶以在目標系統上執行惡意代碼。

下圖顯示了流行的PDF Reader?Adobe Acrobat Reader中發現的漏洞數量。多年來漏洞的數量正在增加,但今年發現的漏洞數量略少(但今年尚未結束)。最重要的漏洞是代碼執行漏洞,攻擊者可以使用這些漏洞在目標系統上執行任意代碼(如果尚未修補Acrobat Reader)。

這是一個重要的指標,我們應該定期更新我們的PDF閱讀器,因為最近發現的漏洞數量非常艱巨。

2. PDF文件結構

每當我們想要發現軟件中的新漏洞時,我們首先應該了解我們試圖發現新漏洞的協議或文件格式。在我們的例子中,我們應該首先詳細了解PDF文件格式。在本文中,我們將了解PDF文件格式及其內部結構。

PDF是一種可移植的文檔格式,可用于呈現包含文本,圖像,多媒體元素,網頁鏈接等的文檔。它具有廣泛的功能。我們必須首先理解的是,PDF文件格式規范在這里是公開的,任何對PDF文件格式感興趣的人都可以使用。PDF文件格式的文檔幾乎有800頁,因此閱讀并不是為期一天的快速閱讀,但需要花費大量時間。

PDF具有比文本更多的功能;?它可以包含圖像和其他多媒體元素,可以受密碼保護,可以執行JavaScript等。圖像文件的基本結構如下圖所示:

每個PDF文檔都包含以下元素:

- 標題:這是PDF文件的第一行,指定文檔使用的PDF規范的版本號。如果我們想要找到它,我們可以使用十六進制編輯器或只需使用xxd命令,如下所示:

<span style="color:#474747"># xxd temp.pdf | head -n 1 0000000: 2550 4446 2d31 2e33 0a25 c4e5 f2e5 eba7 %PDF-1.3.%...... </span>

temp.pdf PDF文檔使用PDF規范1.3。'%'字符是PDF中的注釋,因此上面的示例實際上顯示第一行和第二行是注釋,對于所有PDF文檔都是如此。以下字節取自以下輸出:2550 4446 2d31 2e33 0a25 c4e5,對應ASCII文本“%PDF-1.3。%”。以下是一些使用不可打印字符的ASCII字符(請注意'。'點),這些字符通常告訴某些軟件產品該文件包含二進制數據,不應被視為7位ASCII文本。目前版本號的格式為1.N,其中N的范圍為0-7。

-正文在PDF文檔的正文中,有些對象通常包括文本流,圖像,其他多媒體元素等。“正文”部分用于保存向用戶顯示的所有文檔數據。

- xref表:這是交叉引用表,其中包含對文檔中所有對象的引用。交叉引用表的目的是允許隨機訪問文件中的對象,因此我們不需要讀取整個PDF文檔來定位特定對象。每個對象由交叉??引用表中的一個條目表示,該條目總是20個字節長。讓我們舉個例子:

<span style="color:#474747">xref 0 1 0000000023 65535 f 3 1 0000025324 00000 n 21 4 0000025518 00002 n 0000025632 00000 n 0000000024 00001 f 0000000000 00001 f 36 1 0000026900 00000 n </span>

?

我們可以通過簡單地用文本編輯器打開PDF并滾動到文檔的底部來顯示PDF文檔的交叉引用表。在上面的例子中,我們可以看到我們有四個子部分(注意四行只包含兩個數字)。這些行中的第一個數字對應于對象編號,而第二行表示當前子部分中的對象數。每個對象由一個條目表示,該條目長度為20個字節(包括CRLF)。前10個字節是對象從PDF文檔開頭到該對象開頭的偏移量。接下來是一個空格分隔符,其中另一個數字指定了對象的世代號。之后還有另一個空格分隔符,后跟一個字母'f'或'n',表示該對象是空閑還是正在使用。

第一個對象的ID為0,并且始終包含一個生成號為65535的條目,該條目位于自由對象列表的開頭(注意字母“f”表示空閑)。交叉引用表中的最后一個對象使用世代號0。

第二個子部分有一個對象ID 3并包含1個元素,對象3從文檔開頭的25324個字節開始。第三個子部分有四個對象,第一個子對象的ID為21,并從文件開頭的偏移量25518開始。其他對象具有后續數字22,23和24.所有對象都標記有標記“f”或“n”。標記'f'表示對象可能仍然存在于文件中,但標記為空閑,因此不應使用它。這些對象包含對下一個自由對象的引用,以及在對象再次生效時要使用的世代號。標志'n'用于表示有效和已使用的對象,這些對象包含從文件開頭到對象的世代號的偏移量。

注意,對象零點指向表中的下一個自由對象,即對象23.但由于對象23也是空閑的,它本身指向表中的下一個自由對象,對象24.但是對象24是文件上的最后一個自由對象,因此它指向對象零。如果我們用每個對象編號表示上面的交叉引用表,它將如下所示:

<span style="color:#474747">xref 0 1 0000000023 65535 f 3 1 0000025324 00000 n 21 1 0000025518 00002 n 22 1 0000025632 00000 n 23 1 0000000024 00001 f 24 1 0000000000 00001 f 36 1 0000026900 00000 n </span>

?

當對象被釋放時,對象的世代號遞增,因此如果對象再次變為有效(將標志從“f”更改為“n”),則世代號仍然有效而不必增加它。對象23的世代號是1,所以如果它再次變為有效,則世代號仍將是1,但如果它再次被刪除,則世代號將增加到2。

多個子部分通常存在于已逐步更新的PDF文檔中,否則只應出現一個以數字零開頭的子部分。?

- 預告片:?PDF預告片指定閱讀PDF文檔的應用程序應如何找到交叉引用表和其他特殊對象。所有PDF閱讀器都應該從文件末尾開始閱讀PDF。下面是一個示例預告片:

<span style="color:#474747">trailer &lt;&lt; /Size 22 /Root 2 0 R /Info 1 0 R &gt;&gt; startxref 24212 %%EOF </span>

?

PDF文檔的最后一行包含文件字符串'%% EOF'的結尾。在文件標記結束之前,有一行帶有字符串startxref,用于指定從文件開頭到交叉引用表的偏移量。在我們的例子中,交叉引用表從偏移24212字節開始。在此之前是一個字符串預告片,它指定了預告片部分的開頭。預告片部分的內容嵌入在<<和>>字符中(這是一個接受鍵值對的字典)。我們可以看到預告片部分定義了幾個鍵,每個鍵用于特定動作。預告片部分可以指定以下鍵:

-?/ Size?[integer]:指定交叉引用表中的條目數(也計算更新部分中的對象)。使用的數字不應是間接參考。

- / Prev [integer]:指定從文件開頭到上一個交叉引用部分的偏移量,如果有多個交叉引用部分,則使用該偏移量。該數字應該是交叉引用。

-?/ Root?[字典]:指定文檔目錄對象的引用對象,它是一個特殊對象,包含指向不同類型的其他特殊對象的各種指針(稍后將詳細介紹)。

- / Encrypt [dictionary]:指定文檔的加密字典。

- / Info [字典]:指定文檔信息字典的引用對象。

- / ID [array]:指定形成文件標識符的兩個字節未加密字符串的數組。

- / XrefStm [integer]:指定從解碼流中的文件開頭到交叉引用流的偏移量。這僅存在于混合引用文件中,如果我們還想要打開文檔,即使應用程序不支持壓縮引用流,也會指定它。

我們必須記住,如果我們稍后更新PDF文檔,可以修改初始結構。更新通常會在文件末尾附加其他元素。

道德黑客培訓 - 資源

3.增量更新

PDF的設計考慮了增量更新,因為我們可以將一些對象附加到PDF文件的末尾,而無需重寫整個文件。因此,可以快速保存對PDF文檔的更改。PDF文檔的新結構如下圖所示:

我們可以看到PDF文檔仍然包含原始標題,正文,交叉引用表和預告片。此外,還有其他Body,Cross-reference和Trailer部分已添加到PDF文檔中。其他交叉引用部分將僅包含已更改,替換或刪除的對象的條目。刪除的對象將保留在文件中,但將標記為標記“f”。每個trailed需要由'%% EOF'標記終止,并且應包含指向上一個交叉引用部分的/ Prev條目。

在PDF版本1.4及更高版本中,我們可以在文檔的目錄字典中指定Version條目,以覆蓋PDF標題中的默認版本。

4.例子

讓我們提供一個簡單的PDF示例并進行分析。讓我們從這里下載一個示例PDF文檔并進行分析。打開此PDF文檔后,它看起來如下所示:

交叉參考和預告片部分如下圖所示:

為清楚起見,交叉參考部分已經減少。交叉引用部分包含一個本身包含223個對象的子部分。預告片部分從字節偏移50291開始,包括223個對象,其中根元素指向對象221并且Info元素指向對象222。

在下一節中,我們將了解PDF結構的基本數據類型。

5. PDF數據類型

PDF文檔包含下面描述的八種基本類型的對象。即這些類型的對象是:布爾值,數字,字符串,名稱,數組,字典,流和空對象。可以標記對象,以便其他對象可以引用它們。帶標簽的對象也稱為間接對象。

5.1。布爾

有兩個關鍵字:truefalse表示布爾值。

5.2。數字

PDF文檔中有兩種類型的數字:整數和實數。整數由一個或多個數字組成,可選地前面帶有符號加(字符'+')或減號(字符' - ')。整數對象的示例如下所示:

<span style="color:#474747">123 +123 -123 </span>

實數值可以用一個或多個帶有可選符號和前導,尾隨或嵌入小數點(句點 - 字符'。')的數字表示。下面是一個實數的例子:

<span style="color:#474747">123.0 -123.0 +123.0 123. -.123 </span>

5.3。名稱

PDF文檔中的名稱由0x21 - 0x7E范圍內的ASCII字符序列表示。例外是:%,(,),<,>,[,],{,},/和#,必須以斜杠開頭。字符的替代表示是十六進制等效,前面是字符'#'。name元素的長度有一個限制,可能只有127個字節長。

在寫名字時,必須使用斜線來引入名稱;?斜杠不是名稱的一部分,而是一個前綴,表示后面是表示名稱的字符序列。如果我們想使用空格或任何其他特殊字符作為名稱的一部分,則必須使用2位十六進制表示法進行編碼。

名稱的例子可以在下表中看到,它取自[1]:

5.4。字符串

PDF文檔中的字符串表示為由括號或尖括號括起的一系列字節,但最長可達65535個字節。任何字符都可以用ASCII表示來表示,也可以用八進制或十六進制表示來表示。八進制表示要求字符以\ ddd格式寫入,其中ddd是八進制數。十六進制表示要求字符以<dd>的形式寫入,其中dd是十六進制數。

表示嵌入括號中的字符串的示例如下所示:

<span style="color:#474747">(mystring) </span>

表示嵌入尖括號中的字符串的示例如下所示(下面的十六進制表示與上面的相同,它讀作'mystring'):

<span style="color:#474747">&lt;6d79737472696e67&gt; </span>

我們還可以在表示字符串時使用特殊的已知字符:它們是:\ n表示新行,\ r表示回車符,\ t表示水平制表符,\ b表示退格鍵,\ f表示換頁符\,(左括號) ,\)表示右括號,\\表示反斜杠。

5.5。數組

PDF文檔中的數組表示為一系列PDF對象,可以是不同類型的,并用方括號括起來。這就是PDF文檔中的數組可以包含任何對象類型(如數字,字符串,字典甚至其他數組)的原因。數組也可以具有零元素。陣列呈現方括號。下面給出了一個數組示例:

<span style="color:#474747">123 123.0 true (mystring) /myname] </span>

5.6。字典

PDF文檔中的字典表示為鍵/值對的表。鍵必須是Name對象,而值可以是任何對象,包括另一個字典。字典中的最大條目數為4096個條目。可以使用雙尖括號<<和>>括起來顯示字典。字典的一個例子如下:

<span style="color:#474747">&lt;&lt; /mykey1 123/mykey2 0.123/mykey3 &lt;&lt; /mykey4 true/mykey5 (mystring)&gt;&gt; &gt;&gt;</span>

5.7。流

流對象由字節序列表示,并且長度可以是無限的,這就是圖像和其他大數據塊通常表示為流的原因。流對象由字典對象表示,后跟關鍵字stream,后跟換行符和endstream

下面是一個流對象的示例:

<span style="color:#474747">&lt;&lt; /Type /Page/Length 23 0 R/Filter /LZWDecode &gt;&gt; stream … endstream </span>

所有流對象都應是間接對象,流字典應是直接對象。流字典指定流的確切字節數。在數據之后應該有換行符和endstream關鍵字。

所有流字典中使用的常用關鍵字如下(請注意,長度條目是必需的):

- 長度:PDF文件的字節數用于流的數據。如果流包含Filter條目,則Length應指定編碼數據的字節數。

- 類型:字典描述的PDF對象的類型。

- 過濾器:將在處理流數據時應用的過濾器的名稱。可以按照應用順序指定多個過濾器。

- DecodeParms:Filter指定的過濾器使用的字典或字典數組。此值指定在應用過濾器時需要傳遞給過濾器的參數。如果過濾器使用默認值,則不需要這樣做。

- F:指定包含流數據的文件。

- FFilter:在處理流的外部文件中找到的數據時應用的過濾器的名稱。

- FDecodeParms:由FFilter指定的過濾器使用的字典或字典數組

- DL:指定解碼流中的字節數。如果有足夠的磁盤空間可用于將流寫入文件,則可以使用此方法。

- N:存儲在流中的間接對象的數量。

- 第一:第一個壓縮對象的解碼流中的偏移量。

- Extends:指定對其他對象流的引用,形成繼承樹。

對象流中的流數據將包含N對整數,其中第一個整數表示對象編號,第二個整數表示該對象的解碼流中的偏移。對象流中的對象是連續的,不需要以相對于對象編號的遞增順序存儲。在首先在字典條目識別對象流的第一對象。

我們不應將以下信息存儲在對象流中:

- 流對象

- 世代號不等于零的對象

- 文檔的加密字典

-?對象流字典中的Length條目的間接對象

- 文檔目錄,線性化字典,頁面對象

在PDF 1.5中,交叉引用信息可以存儲在交叉引用流中,而不是存儲在交叉引用表中。每個交叉引用流包含與交叉引用表和尾部等效的信息。

5.8。空對象

null對象由關鍵字null表示。

5.9。間接對象

首先,我們必須知道PDF文檔中的任何對象都可以標記為間接對象,它為對象提供唯一的對象標識符,其他對象可以使用它來引用間接對象。間接對象??是用關鍵字objendobj表示的編號對象。endobj必須存在于它自己的行中,但是obj必須出現在對象ID行的末尾,這是間接對象的第一行。對象ID行由對象編號,世代號和關鍵字“obj”組成。間接對象??的示例如下:

<span style="color:#474747">2 1 obj 12345 endobj </span>

在上面的示例中,我們創建了一個新的間接對象,它保存了12345對象。通過將對象聲明為間接對象,我們可以在PDF文檔交叉引用表中使用它,并在文檔中的任何頁面,字典等中重用它。由于每個間接對象在交叉引用表中都有自己的條目,因此可以非常快速地訪問間接對象。

間接對象??的對象標識符由兩部分組成;?第一部分是當前間接對象的對象編號。間接對象??不需要在PDF文檔中按順序編號。第二部分是世代號,對于新創建的文件中的所有對象,該編號設置為零。稍后在更新對象時遞增此數字。

我們可以引用間接引用的間接對象,它由對象編號,世代號和關鍵字R組成。要引用上面的間接對象,我們必須寫下面的內容:

<span style="color:#474747">2 1 R </span>

如果我們試圖引用一個未定義的對象,我們實際上是指一個null對象。

6.文件結構

PDF文檔由PDF文件正文部分中包含的對象組成。PDF文檔中的大多數對象都是字典。文檔的每個頁面由頁面對象表示,頁面對象是包含對頁面內容的引用的字典。頁面對象連接在一起并形成一個頁面樹,在文檔目錄中使用間接引用聲明。

PDF文檔的整個結構可以用下面的圖片表示[1]:

在上圖中,我們可以看到文檔目錄包含對頁面樹,大綱層次結構,文章線程,命名目標和交互式表單的引用。我們不會詳細介紹每個部分的內容,但我們只介紹最重要的部分,即Page Tree。

6.1。文件目錄

從上圖中,我們可以看到文檔目錄
是PDF文檔中對象的根。我們已經說過,Trailer?PDF部分中的/ Root元素指定了文檔目錄。文檔目錄包含對定義文檔內容的其他對象的引用。它還包含聲明文檔在屏幕上顯示方式的信息。文檔目錄中的條目如下:

- / Type:目錄描述的PDF對象的類型(在我們的例子中,這是Catalog,因為這是文檔目錄對象)。

- / Version:構建文檔的PDF規范的版本。

- / Extensions:本文檔中有關開發人員擴展的信息。

- / Pages:對作為文檔頁面樹根的對象的間接引用。

- / Dests:對作為命名目標對象的根的對象的間接引用。

- /大綱:對大綱目錄對象的間接引用,該對象是文檔大綱層次結構的根。

- / Threads:對表示文檔文章線程的線程字典數組的間接引用。

- /元數據:對包含文檔元數據的元數據流的間接引用。

我們可以看到許多其他條目是文檔目錄的一部分,但這里不會對它們進行描述。讀者可以查看[1]了解詳情。文檔目錄的示例如下所示:

<span style="color:#474747">1 0 obj &lt;&lt; /Type /Catalog /Pages 2 0 R /PageMode /UseOutlines /Outlines 3 0 R &gt;&gt; endobj </span>

6.2。頁面樹

通過頁面樹訪問文檔的頁面,頁面樹定義PDF文檔中的所有頁面。樹包含表示PDF文檔頁面的節點,可以是兩種類型:中間節點和葉節點。中間節點也稱為頁面樹節點,而葉節點稱為頁面對象。最簡單的頁面樹結構可以由單個頁面樹節點組成,該節點直接引用所有頁面對象(因此所有頁面對象都是葉子)。

頁面樹中的每個節點都必須具有以下條目:

- / Type:此對象描述的PDF對象的類型(在我們的例子中是Pages,因為我們討論的是頁面樹節點)。

- / Parent:應存在于除root之外的所有頁樹節點中,此條目不得出現。此條目指定其父級。

- / Kids:應該出現在除葉子之外的所有頁面樹節點中,并指定可從當前節點直接訪問的所有子元素。

- / Count:指定后續頁面樹中此節點后代的葉節點數。

我們必須記住,頁面樹與PDF文檔中的任何內容都沒有關系,例如頁面或章節。

頁面樹的基本示例如下所示[1]:

<span style="color:#474747">2 0 obj &lt;&lt; /Type /Pages /Kids [ 4 0 R 10 0 R 24 0 R ] /Count 3 &gt;&gt; endobj4 0 obj &lt;&lt; /Type /Page ... &gt;&gt; endobj10 0 obj &lt;&lt; /Type /Page ... &gt;&gt; endobj24 0 obj &lt;&lt; /Type /Page ... &gt;&gt; endobj </span>

上面的頁面樹定義了ID為2?的Root對象,它有三個子節點,對象4,10和20.我們還可以看到頁面樹的葉子是指定文檔單個頁面屬性的字典。在為每個文檔頁面定義它們時,我們可以使用多個屬性;?所有這些都在[1]中指定。

我們已經看到了PDF文檔的基本結構及其數據類型。如果我們想要開始在PDF閱讀器中查找漏洞,我們需要更改PDF文檔,使PDF閱讀器無法處理它并崩潰。通常,如果我們可以讓PDF閱讀器崩潰,我們就會發現一個安全漏洞,我們可以使用它來在目標機器上執行任意代碼。

7.一個例子

在本文中,我們將看一個PDF文檔的一個非常簡單的示例。首先,我們需要創建PDF文檔,然后我們將嘗試分析它。要創建PDF文檔,我們首先創建一個非常簡單的latex .tex文檔,其中包含的內容如下圖所示:

我們可以看到.tex文檔實際上并不多。首先,我們將文檔定義為文章,然后在開始結束文檔中包含文章的內容。我們將包含一個標題為“?簡介”的新部分,其中包含一個靜態文本“Hello World!”。我們可以使用pdflatex命令將.tex文檔編譯為PDF文檔,并將.tex文件的名稱指定為參數。生成的PDF看起來如下圖所示:

我們可以看到PDF文檔確實不包含很多,只包含我們實際包含的文本,沒有圖片,JavaScript或其他元素。

8.例1

我們來看看PDF文檔結構,它在下面的輸出中顯示:

<span style="color:#474747">%PDF-1.5 %D??? 3 0 obj &lt;&lt; /Length 138 /Filter /FlateDecode &gt;&gt; stream ... endstream endobj 10 0 obj &lt;&lt; /Length1 1526 /Length2 7193 /Length3 0 /Length 8194 /Filter /FlateDecode &gt;&gt; stream ... endstream endobj 12 0 obj &lt;&lt; /Length1 1509 /Length2 9410 /Length3 0 /Length 10422 /Filter /FlateDecode &gt;&gt; stream ... endstream endobj 15 0 obj &lt;&lt; /Producer (pdfTeX-1.40.12) /Creator (TeX) /CreationDate (D:20121012175007+02'00') /ModDate (D:20121012175007+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) &gt;&gt; endobj 6 0 obj &lt;&lt; /Type /ObjStm /N 10 /First 65 /Length 761 /Filter /FlateDecode &gt;&gt; stream ... endstream endobj 16 0 obj &lt;&lt; /Type /XRef /Index [0 17] /Size 17 /W [1 2 1] /Root 14 0 R /Info 15 0 R /ID [&lt;1DC2E3E09458C9B4BEC8B67F56B57B63&gt; &lt;1DC2E3E09458C9B4BEC8B67F56B57B63&gt;] /Length 60 /Filter /FlateDecode &gt;&gt; stream ... endstream endobj startxref 20215 %%EOF </span>

創建這樣一個簡單的PDF文檔有很多必要的元素,所以我們可以想象一個非常復雜的PDF文檔看起來如何。我們還需要記住,為了清楚和簡潔,所有編碼數據流都被刪除并替換為三個點(如下所示:'...')。

讓我們介紹每個PDF部分。的報頭中可以看到下面的圖片:

機身可以看到下面的圖片:

所述外部參照部分可以看出,在下面的圖片:

最后,預告片部分如下所示:

我們提供了PDF文檔的所有部分,但我們仍需要進一步分析它們。PDF文檔的標題是標準的,我們真的不需要談論它,讓我們離開正文部分以供日后使用。這就是為什么我們必須首先看一下外部參照部分。我們可以看到從文件開頭到Xref表的偏移量是20215字節,十六進制格式為0x4ef7。如果我們看一下xxd工具可以得到的文件的十六進制表示,我們可以看到下圖中顯示的內容:

突出顯示的字節恰好位于距文件開頭20125字節的開頭。前面的0x0a字節是新行,當前的0x31字節表示數字1,它恰好是Xref表的開頭。這就是為什么Xref表用一個ID為16且生成號為0的間接對象表示的原因(這應該是所有對象的情況,因為我們剛剛創建了PDF文檔而且所有對象都沒有被更改;如果我們看的話在整個PDF文檔中,我們可以看到這顯然是正確的;所有對象的世代號為零)。

間接對象的/ Type將其分類為外部參照表。的/索引數組包含于本節中的每個子部分的一對整數。第一個整數指定子節中的第一個對象編號,第二個整數指定子節中的條目數。在我們的示例中,對象編號為零,此子節中有17個條目。這也是由/ Size指令指定的。請注意,此數字大于子部分中任何對象編號的最大數字。的/ W屬性指定表示交叉引用項中的字段的大小整數數組。[1 2 1]表示字段是一個字節,兩個字節和一個字節。

之后有/ Root元素,它指定PDF文檔的目錄目錄為對象編號14.?/ Info是對象編號15中包含的PDF文檔的信息目錄。/?ID數組是必需的,因為加密條目存在并包含兩個構成文件標識符的字符串。這兩個字符串用作加密算法的輸入。的/長度指定比特加密密鑰的長度;?該值應為40 t o128范圍內的8的倍數(默認值為40)。在我們的例子中,加密密鑰的長度是60位。該/過濾器指定此文檔的安全性處理程序的名稱;?這也是用于加密文檔的安全處理程序。在我們的例子中,這是FlateDecode,它使用zlib / deflate壓縮方法對數據進行編碼。

我們可以看到Xref表的其他部分是壓縮的,所以我們無法真正閱讀它。我們當然可以在壓縮數據上應用一些zlib解壓縮算法,但是有更好的選擇。如果工具已經存在,我們為什么要為此編寫程序?使用pdftk,我們可以使用以下命令修復PDF損壞的外部參照表:

<span style="color:#474747"># pdftk in.pdf output out.pdf </span>

之后,out.pdf文件包含以下外部參照和預告片部分:

顯然,/ Root和/ Info對象編號也已更改,其他內容也已更改,但我們獲得了定義Xref表的預告片外部參照關鍵字。我們可以看到Xref表中有14個對象。

我們可以繼續嘗試解碼其他部分,但我想這不屬于本文的范圍。接下來,我們寧愿檢查未編碼的文檔。

9.例2

我們來看一下可在此處訪問的示例PDF文檔:www.stluciadance.com/prospectus_file/sample.pdf。某些流對象已加密,但現在不是那么重要。既然我們已經知道如何處理PDF文檔,我們就不會在簡單的東西上丟失太多的話。讓我們在文本編輯器中打開PDF,比如gvim,然后查看Trailer部分。我們現在必須知道所有PDF文檔都應該從頭到尾閱讀。預告片如下圖所示:

讓我們也只用幾個對象呈現外部參照(其余部分為了清晰起見而被丟棄):

我們可以看到PDF文檔的/ Root包含在ID為221的對象中,對象222中有附加信息。對象221是整個文檔中最重要的對象,所以讓我們呈現它;?它可以在下圖中看到:

我們可以看到該對象確實是文檔目錄。該頁面樹對象是212,輪廓對象213,對象是220和OpenAction對象是58.我們還沒有談到任何其它類型的頁比樹對象,因此我們將繼續與頁面樹只談。

具有ID 212的頁面樹對象如下圖所示:

因此212對象包含PDF文檔的實際頁面。它包含10頁,這是完全正確的(如果我們用任何PDF閱讀器打開PDF文件并檢查頁數,我們可以檢查這一點)。我們知道Kids屬性指定了可以從當前節點直接訪問的所有子元素。在我們的例子中,有兩個直接子節點,對象id為66和135.對象66如下所示:

對象66包含具有ID 57,69,75,97,108和120的其他子元素。

對象135還定義了對象129,138,133和158。

如果我們計算所有元素,我們可以看到正好有10個元素,這意味著10個頁面中有10個頁面。這進一步意味著所有呈現的對象實際上是PDF文檔的實際頁面,并且不包含任何其他子節點。所有呈現的對象都是相似的聲明,因此我們不會依次查看每個對象。相反,我們只看一個對象,即對象57.對象57包含聲明如下:

我們可以看到對象的類型是/ Page,這直接暗示這是一個葉節點,它呈現PDF文檔的一個頁面。該PDF頁面的內容可以在對象62中找到;?該對象如下圖所示:

我們可以看到PDF頁面的實際內容是用FlateDecode編碼的,這只是一個簡單的zlib編碼算法。

10.結論

我們已經看到了兩個如何構建PDF文檔的例子。憑借我們獲得的知識,我們可以開始生成錯誤的PDF文檔并將其提供給各種PDF閱讀器。如果某個PDF閱讀器在閱讀某個PDF文檔時崩潰,該文檔包含PDF閱讀器無法處理和崩潰的內容。這意味著存在漏洞的可能性,需要進一步研究。

最后,如果存在漏洞,我們甚至可以編寫包含惡意代碼的PDF文檔,當受害者在目標計算機上使用易受攻擊的PDF閱讀器打開PDF文檔時執行該惡意代碼。在這種情況下,整個機器可能會受到損害,因為只需打開惡意PDF文檔就可以執行任意惡意代碼。

?

轉載來源:https://resources.infosecinstitute.com/pdf-file-format-basic-structure/

總結

以上是生活随笔為你收集整理的【翻译】PDF格式详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。