成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PDF文件解析與PDF惡代分析中的一些坑

安全
本文是對作者近期分析過的文檔類惡意代碼的總結,其中著重講述PDF文件的解析與其中的惡意代碼分析,以及分析過程中的一些經驗與教訓。

一、簡介

最近在做文檔類的惡代檢測,寫個總結。

本篇文章負責介紹pdf文檔的格式以及惡代分析中需要注意的問題以及相應工具推薦。希望能給各位做惡代分析時提供一些幫助。

后序會更新一些其他文檔格式解析與惡代分析內容等,歡迎各位關注。

[[208685]]

二、PDF文件格式介紹

PDF(便攜式文件格式,Portable Document Format)是由Adobe Systems于1993年基于文件交換所發展出的一種文件格式。Adobe公司素有“漏洞之王”的美譽,所以學習PDF文件格式對研究分析漏洞具有極大幫助。PDF格式較為復雜,本文以研究漏洞的目的分析PDF格式,探尋如何找出并分析PDF中存在的惡意代碼,而并非做一個詳細的PDF parser解析器,因此會省略對不相關關鍵字的介紹,請各位留意。

PDF的結構可以從文件結構和邏輯結構兩個方面來理解。PDF的文件結構指的是其文件物理組織方式,邏輯結構則指的是其內容的邏輯組織方式。

1. PDF的文件結構

PDF文件格式包含以下4個部分:

  • 文件頭——指明了該文件所遵從的PDF規范的版本號,它出現在PDF文件的第一行。
  • 文件體——又稱對象集合,PDF文件的主要部分,由一系列對象組成。
  • 交叉引用表——對對象進行隨機存取而設立的一個間接對象的地址索引表。(實際以偏移+索引的方式儲存對象地址,下文會提及)
  • 文件尾——聲明了交叉引用表的地址,即指明了文件體的根對象(Catalog),從而能夠找到PDF文件中各個對象體的位置,達到隨機訪問。另外還保存了PDF文件的加密等安全信息。

2. PDF文件格式圖示:

PDF文件的邏輯結構

3. PDF文件的邏輯結構

本段主要介紹PDF文件體的讀取方式。

作為一種結構化的文件格式,一個PDF文檔是由一些稱為“對象”的模塊組成的。每個對象都有數字標號,這樣的話可以這些對象就可以被其他的對象所引用。這些對象不需要按照順序出現在PDF文檔里面,出現的順序可以是任意的,比如一個PDF文件有3頁,第3頁可以出現在第1頁以前,對象按照順序出現唯一的好處就是能夠增加文件的可讀性,對象的信息以偏移+索引的形式保存在交叉引用表內。

文件尾說明了根對象的對象號,并且說明交叉引用表的位置,通過對交叉引用表的查詢可以找到目錄對象(Catalog)。這個目錄對象是該PDF文檔的根對象,包含PDF文檔的大綱(outline)和頁面組對象(pages)引用。大綱對象是指PDF文件的書簽樹;頁面組對象(pages)包含該文件的頁面數,各個頁面對象(page)的對象號。

4. PDF的層級結構圖示:

 PDF的層級結構圖示

頁面(page)對象為PDF中最重要的對象,包含如何顯示該頁面的信息,例如使用的字體,包含的內容(文字,圖片等),頁面的大小。里面的信息可以直接給出,當然里面的子項更多的是對其他對象的引用,真正的信息存放在其他對象里面。頁面中包含的信息是包含在一個稱為流(stream)的對象里,這個流的長度(字節數)必須直接給出或指向另外一個對象(包含一個整數值,表明這個流的長度)。

可見stream流對象我們惡代分析需要獲取的重點。

5. 頁面信息圖示:

頁面信息圖示

理解了上面的內容之后,我們可以得出針對惡代分析的PDF文件的大致解析思路:

針對惡代分析的PDF文件的大致解析思路

當然,也可以采取針對PDF層級結構的文檔解析方式,見仁見智,因人而異。

三、以二進制文本解析Pdf文檔結構

PDF文件是一種文本和二進制混排的格式,但是Adobe更愿意讓人把它當成二進制的文件,所以,PDF文件可以直接拖入16進制編輯器中打開。前面我們介紹了PDF的文件結構以及邏輯結構,現在我們在16進制編輯器中打開PDF文件,更直白的展示PDF的關鍵字段以及文件結構。

  1. %PDF-1.6 #文件頭+版本號,16進制讀取文件0x25 0x50 0x44 0x46開頭即證明是pdf文件 
  2. %çóÏÓ    #下面就是很多的Object對象 
  3. 2 0 obj  #Object對象,其中2是Obj順序號,0是Obj的版本號,obj也是對象開始的標志 
  4. <<       #<<>>之間為Object對象的字典內容,包含關鍵字 
  5. [/ICCBased 3 0 R] 
  6. >> 
  7. Endobj   #Object結束關鍵字 
  8. 7 0 obj 
  9. << 
  10. /Filter 
  11. /FlateDecode   #流對象的壓縮方式為/FlateDecode   
  12. /Length 148    #流對象的長度 
  13. >> 
  14. Stream         #流對象 
  15. #文件內容信息,注:此處為直觀從而手動填寫的 
  16. Endstream      #流對象結束標志 
  17. Endobj 
  18. 8 0 obj 
  19. << 
  20. /Contents 7 0 R              #頁面內容對象的對象號為7 
  21. /MediaBox [0 0 595.2 841.68] #頁面顯示大小,以像素為單位 
  22. /PageIndex 1 
  23. /Parent 1 0 R               #其父對象號為1以及Pages對象 
  24. /Resources                  #該頁包含的資源 
  25. <</Font <</F4 4 0 R >>      #字體的類型 
  26. /Shading <<>> 
  27. /XObject <<>>               #外部對象 
  28. /ColorSpace <</CS1 2 0 R>>  
  29. >> 
  30. /Type /Page 
  31. >> 
  32. Endobj 
  33. 1 0 obj 
  34. << 
  35. /Count 1        #頁碼數量為1 
  36. /Kids [8 0 R ]  #kids對象說明它的子頁對象為8 
  37. /Type /Pages 
  38. >> 
  39. Endobj 
  40. 13 0 obj 
  41. << 
  42. /Author (? Cryin') 
  43. /CreationDate (D:20100926145832+08'00') 
  44. /Title (? PDF文件格式分析) 
  45. >> 
  46. endobj 
  47. Xref           #表示交叉引用表開始 
  48. 0 14           #0表明引用表描述的對象編號從0開始,8說明共有8個對象#此行在交叉引用表中可出現多個 
  49. 0000000000 65536 f #一般pdf都是以這行開始交叉引用表的,起始地址0和產生號 
  50. 0000003195 00000 n #表示對象1,就是catalog,3195為偏移地址n表示對象在使用 
  51. 0000000018 00000 n 
  52. 0000000051 00000 n 
  53. 0000003464 00000 n 
  54. 0000000000 00000 f 
  55. 0000004282 00000 n 
  56. 0000002728 00000 n 
  57. 0000002992 00000 n 
  58. 0000003256 00000 n 
  59. 0000003892 00000 n 
  60. 0000003620 00000 n 
  61. 0000008660 00000 n 
  62. 0000008712 00000 n 
  63. Trailer      #說明文件尾對象開始 
  64. <</Size 14   #14說明PDF文件對象數目 
  65. /Root 12 0 R #說明跟對象號為12 
  66. /Info 13 0 R>> 
  67. startxref 
  68. 8980     #8980為交叉引用表的偏移地址,此處為十進制表示 
  69. %%EOF    #文件結束標志 

對于對象的額外解釋:如果一個樣本文件的交叉引用表格式如下

  1. xref 
  2. 0 5 
  3. 0000000000 00000 n #第1行 
  4. 0000004996 00000 n #第2行 
  5. 0000000022 00000 n #第3行 
  6. 0000005101 00000 n #第4行 
  7. 0000004976 00000 n #第5行 
  8. 0000004996 00000 n #第n行 
  9. 4 0 obj 
  10. Xxxxx 
  11. endobj 

即交叉引用表中第五行順序數為4的對象,其偏移為4976

四、Pdf文件混淆

如圖,下面的樣本進行了混淆

  1. %PDF-1.5 
  2. 1 0 obj 
  3. <</#54#79P#65 R 0 5 
  4. O#70e#6e#41c#74i#6fn 3 Pages C#61ta#6c#6f#67>> 
  5. endobj 

解釋:<<>>代表obj對象之間的字典內容,保存了流的關鍵字和特征信息,因此去除混淆是必要的第一步操作,pdf文件的混淆只出現在這里#54代表0x54,上面的內容去除混淆之后即為

  1. 1 0 obj 
  2. <</TyPe R 0 5 OpenAction 3 Pages 
  3. Catalog>> 
  4. endobj 

五、關鍵字

下面介紹了PDF文件解析時所需要的關鍵字

  1. obj            #obj對象開始 
  2. endobj         #obj對象結束 
  3. stream         #stream流對象開始 
  4. endstream      #stream流對象結束 
  5. xref           #交叉引用表開始 
  6. trailer        #文件尾對象開始 
  7. startxref      #交叉引用表結束 
  8. /Page        #文件頁數 
  9. /Encrypt       #是否加密 
  10. /ObjStm        #objectstreams的數量,objectstreams可包含其他Object對象,即嵌套 
  11. /JS            #代表javascript嵌有JavaScript代碼,可直接提取惡意代碼 
  12. /JavaScript    #代表javascript嵌有JavaScript代碼,可直接提取惡意代碼 
  13. /AA            #以下三個為特定特征,打開對象自動執行 
  14. /OpenAction 
  15. /AcroForm 
  16. /URI           #內嵌url鏈接 
  17. /Filter        #/Filter字段出現,表示了下面的stream流進行了加密 
  18. /RichMedia     #富文本 
  19. /Launch        #執行Action的次數與OpenAction字段關聯 
  20. #/xxxx 帶斜杠的關鍵字包含在<<>>字典內部 

六、流的提取

/Filter關鍵字之后保存了stream流的編碼信息一共包括以下幾種:

  1. /FlateDecode 
  2. /ASCIIHexDecode 
  3. /ASCII85Decode 
  4. /LZWDecode 
  5. /DCTDecode 
  6. /RunLengthDecode 
  7. /CCITTFaxDecode 
  8. /JBIG2Decode 
  9. /JPXDecode 
  10. /Crypt 

一共包括上面幾種編碼方式,按常見順序進行了排序,可以級聯編碼。例如:

  1. 0 0 obj 
  2. <</Filter 
  3. [/FlateDecode /ASCIIHexDecode] 
  4. /Length 14278>> 

表示流先經過了ASCIIHexDecode再經過了FlateDecode編碼解密是即先對流進行FlateDecode解碼再對流進行ASCIIHexDecode解碼目前遇到2種級聯編碼樣本(如上),可能會有更多級聯編碼方式(3級或以上)解碼后能夠觸發攻擊的流對象為javascript腳本或者圖片對象,常見的惡意攻擊代碼儲存在javascript腳本中。

下面的圖片是提取自樣本中的PDF steam流文件中的js腳本,已經很明顯是攻擊代碼了:

七、一些坑

PDF的惡意攻擊樣本毫無疑問會使用一些特殊手段對抗殺軟的掃描檢查,下面統計了一下惡意樣本常見的規避行為:

1. 交叉引用表

(1) 坑1 引用表偏移不正確

  1. Xref    #表示交叉引用表開始 
  2. 0 2     #0表明引用表描述的對象編號從0開始,8說明共有8個對象 
  3. 0000000000 65536 f #一般pdf都是以這行開始交叉引用表的,起始地址0和產生號 
  4. 0000003195 00000 n #表示對象1,就是catalog,3195為偏移地址n表示對象在使用 
  5. startxref 
  6. 8980  #8980為交叉引用表的偏移地址,此處為十進制表示 
  7. %%EOF #文件結束標志 

上面有提到過交叉引用表的偏移地址為固定數值,推測adobe的parser是從文件尾開始解析,獲得交叉引用表的偏移地址(Xref中X在文檔中所在的位置即為偏移地址),找到交叉引用表再定位到各個對象,實際測試發現偏移地址可以不正確8980偏移地址實際可能為任意地址。

(2) 坑2 引用表可以有多個

  1. xref 
  2. 0 4 
  3. 0000000000 65535 f 
  4. 0000000000 65536 n 
  5. 0000039095 00000 n 
  6. 0000000015 00000 n 
  7. trailer 
  8. <</ID 
  9. [<386e381fac5d8245e24ee620741d0d06><b15c4bebcdae6f2210f09460b841e7a3>]/Root 
  10. 26 0 R/Size 28/Info 27 0 R>> 
  11. startxref 
  12. 39630 
  13. %%EOF 
  14. <</Filter/FlateDecode/Length 
  15. 6960/Subtype/Type1C>> 
  16. Stream 
  17. Ddd 
  18. endstream 
  19. xref 
  20. 20 1 
  21. 0000040341 00000 n 
  22. 26 4 
  23. 0000040380 00000 n 
  24. 0000040484 00000 n 
  25. 0000040677 00000 n 
  26. 0000040734 00000 n 
  27. 55 2 
  28. 0000172790 00000 n 
  29. 0000172925 00000 n 
  30. trailer 
  31. <</Root 26 0 R/Info 27 0 
  32. R/ID[<386E381FAC5D8245E24EE620741D0D06><39FE58436C8CC909F538F88909F1EE55>]/Size 
  33. 63/Prev 39630>> 
  34. startxref 
  35. 173446 
  36. %%EOF 

樣本如上,正常來講,一個文檔只存在一個%EOF結束符,但是這個樣本里出現了兩個

2. 字符串長度

(1) 坑1 流對象長度可以直接跟對象

正常一個字典語句中/Length之后的數值代表stream~endstream兩個關鍵字之間流的長度,如下

  1. 7 0 obj 
  2. <</Filter/FlateDecode/Length 6960/Subtype/Type1C>> 
  3. stream 

但測試發現流的長度可以是obj對象

  1. 2 0 obj 
  2. << /Length 4 0 R /Filter 
  3. /FlateDecode >> 
  4. #對應的obj對象中包含的長度如下 
  5. 4 0 obj 
  6. 4880 
  7. endobj 

所以stream流對象壓縮前的實際長度為4880雖然是PDF格式的正規使用方法,但同時也是規避殺軟的一種手法。

(2) 坑2 流對象長度可以為任意值

  1. 7 0 obj 
  2. <</Filter/FlateDecode/Length 
  3. 6960/Subtype/Type1C>> 
  4. stream 

同理,正常流對象長度為上圖,實際測試發現樣本

  1. 16 0 obj 
  2. << 
  3. /Length ANIWAY_____LEN 
  4. >> 
  5. stream 

WTF is ANIWAY_LEN??? 長度可以為填ascii字符???所以,/Length后面可以不跟數值stream流的實際長度實際==關鍵字endstream偏移-關鍵字stream偏移-包含的0x0D或0x0A

3. 解碼問題

(1) 坑1 javascript可以支持文本和八進制

  1. 7 0 obj 
  2. << /Type /Action 
  3. /S /JavaScript 
  4. /JS (\145\166\141\154\050\146\165\156) 
  5. endobj 
  6. /JS 16 0 R 
  7. /S /JavaScript 
  8. >> 
  9. endobj 
  10. 16 0 obj 
  11. << 
  12. /Length ANIWAY_____LEN 
  13. >> 
  14. stream 
  15. function urpl(k,sc){ 
  16. var c = "\x75"
  17. var kkc=k+c; 
  18. var re = /MM/g; 
  19. scsc = sc.replace(re,kc); 
  20. return sc; 
  21. padding_0c = "MM0c0cMM0c0c"
  22. padding00="MM0000"
  23. padding_41 = "MM4141"
  24. var x1=0
  25. var x2=0
  26. var x3=0
  27. endstream 
  28. endobj 

有JS編程基礎的肯定注意到了,因此在這里需要判斷javascript內容在對象中還是在()內亦或是否需要轉碼

(2) 坑2 編碼方式縮寫形式

  1. 1 0 obj 
  2. <</Filter [/Fl /Fl] /Length 8331 
  3. >> 
  4. Stream 
  5. xœíÜYXù 
  6. ÷qÆÌ0K3ÆØRÆVdoUƒQ"[M!S(íRÓ¾0–h¥B*d•hß~5´© 
  7. endstream 

正常文件默認/Filter關鍵字之后會出現xxdecode關鍵字表示stream流編碼方式,但測試發現樣本可以沒有xxdecode關鍵字,但同樣進行了編碼處理,如上/Fl字段即為/FlateDecode的簡寫,對應表如下:

  1. /FlateDecode     /Fl 
  2. /ASCIIHexDecode  /AHx 
  3. /ASCII85Decode   /A85 
  4. /LZWDecode       /LZW 
  5. /RunLengthDecode /RL 
  6. /CCITTFaxDecode  /CCF 
  7. /JBIG2Decode #/JBIG2Decode其實和/DCTDecode解碼方式是一樣的 
  8. /DCTDecode       /DCT 

(3) 坑3 編碼形式可以級聯

  1. 10 0 obj 
  2. <</Filter 
  3. [/FlateDecode /ASCIIHexDecode] 
  4. /Length 14278>> 

如上表示流先經過了ASCIIHex加密再進行了FlateDecode加密解碼時需要先進行FlateDecode解密之后再進行ASCIIHexDecode解密

八、常用分析工具推薦

介紹完惡代格式后,推薦一些惡代分析的基本工具

1. PdfStreamDumper

  • stream流解析工具
  • vb開源項目。工具存在一些bug,無法解析級聯編碼后的stream流,例如/Fl/Fl編碼就無法解析

2. PDFParser

  • c++開源項目,pdf格式解析,邏輯比較清晰,可以參考

3. ParanoiDF

  • python開源項目,惡代分析
  • 此外還有一些很贊的開源項目如pyew、peepdf等等,不一一貼地址了。

4. References

  • PDF, let me count the way...
  • Cryin/PDFTear
  • Adobe PDF 官方文檔
  • Malicious Document PDF analysis in 5 steps
  • C#實現的PDF解析器
責任編輯:趙寧寧 來源: 安全客
相關推薦

2021-06-30 07:19:35

微服務業務MySQL

2021-06-08 06:13:16

React開發開發技術

2009-07-02 10:52:30

JavaBean規范

2020-08-07 08:04:03

數據庫MySQL技術

2021-04-16 08:11:24

js前端JavaScript

2017-11-14 15:22:06

ReactNativeAppBugly

2017-05-10 15:30:30

skynet崩潰程序

2018-11-20 14:24:46

數據分析數據庫統計

2018-03-26 20:00:32

深度學習

2022-02-16 07:37:36

惡意文檔網絡釣魚攻擊

2011-10-31 09:26:10

jQuery

2017-04-13 12:59:43

數據分析

2011-08-31 18:28:55

MTK

2020-01-15 15:07:48

JavaArrayList數據

2017-09-01 12:48:34

DevSecOps安全運維

2017-10-16 14:40:50

數據庫MySQL工具

2023-04-17 16:17:19

LinuxPDF

2011-03-08 14:28:03

proftpdGentoo

2017-05-02 21:08:35

開發架構工程師
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文日韩在线视频 | www.亚洲 | 国产欧美一区二区三区在线播放 | 国产 欧美 日韩 一区 | 超碰人人91| 久久精品一级 | 色视频网站免费 | 国产激情在线 | 九九在线视频 | 九九导航| 欧美三级久久久 | 国产 日韩 欧美 在线 | 亚洲巨乳自拍在线视频 | 午夜在线观看免费 | 欧美13videosex性极品 | 国产第1页 | 在线视频91 | 亚洲成av | 国产精品一二三区 | 8x国产精品视频一区二区 | 中文字幕日韩在线 | 操人视频在线观看 | 日本人做爰大片免费观看一老师 | 亚洲精品视频在线看 | 在线观看黄色电影 | 日韩av一区二区在线观看 | 欧美一级黄视频 | 精品国产欧美一区二区三区成人 | 毛片免费视频 | 午夜精品一区二区三区免费视频 | 日韩在线视频免费观看 | 日本在线视频中文字幕 | 欧美一区二区三区在线观看视频 | 91综合网 | 国产成人精品一区二区三区四区 | 日韩亚洲欧美一区 | 国产成人午夜高潮毛片 | 嫩草视频入口 | 国产精品一区二区三区四区 | 人人擦人人 | 国产精品亚洲成在人线 |