日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
PDF文件解析與PDF惡代分析中的一些坑

一、簡(jiǎn)介

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了平順免費(fèi)建站歡迎大家使用!

最近在做文檔類的惡代檢測(cè),寫個(gè)總結(jié)。

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

后序會(huì)更新一些其他文檔格式解析與惡代分析內(nèi)容等,歡迎各位關(guān)注。

二、PDF文件格式介紹

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

PDF的結(jié)構(gòu)可以從文件結(jié)構(gòu)和邏輯結(jié)構(gòu)兩個(gè)方面來理解。PDF的文件結(jié)構(gòu)指的是其文件物理組織方式,邏輯結(jié)構(gòu)則指的是其內(nèi)容的邏輯組織方式。

1. PDF的文件結(jié)構(gòu)

PDF文件格式包含以下4個(gè)部分:

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

2. PDF文件格式圖示:

3. PDF文件的邏輯結(jié)構(gòu)

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

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

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

4. PDF的層級(jí)結(jié)構(gòu)圖示:

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

可見stream流對(duì)象我們惡代分析需要獲取的重點(diǎn)。

5. 頁面信息圖示:

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

當(dāng)然,也可以采取針對(duì)PDF層級(jí)結(jié)構(gòu)的文檔解析方式,見仁見智,因人而異。

三、以二進(jìn)制文本解析Pdf文檔結(jié)構(gòu)

PDF文件是一種文本和二進(jìn)制混排的格式,但是Adobe更愿意讓人把它當(dāng)成二進(jìn)制的文件,所以,PDF文件可以直接拖入16進(jìn)制編輯器中打開。前面我們介紹了PDF的文件結(jié)構(gòu)以及邏輯結(jié)構(gòu),現(xiàn)在我們?cè)?6進(jìn)制編輯器中打開PDF文件,更直白的展示PDF的關(guān)鍵字段以及文件結(jié)構(gòu)。

 
 
 
 
  1. %PDF-1.6 #文件頭+版本號(hào),16進(jìn)制讀取文件0x25 0x50 0x44 0x46開頭即證明是pdf文件
  2. %?ó?ó    #下面就是很多的Object對(duì)象
  3. 2 0 obj  #Object對(duì)象,其中2是Obj順序號(hào),0是Obj的版本號(hào),obj也是對(duì)象開始的標(biāo)志
  4. <<       #<<>>之間為Object對(duì)象的字典內(nèi)容,包含關(guān)鍵字
  5. [/ICCBased 3 0 R]
  6. >>
  7. Endobj   #Object結(jié)束關(guān)鍵字
  8. 7 0 obj
  9. <<
  10. /Filter
  11. /FlateDecode   #流對(duì)象的壓縮方式為/FlateDecode  
  12. /Length 148    #流對(duì)象的長(zhǎng)度
  13. >>
  14. Stream         #流對(duì)象
  15. #文件內(nèi)容信息,注:此處為直觀從而手動(dòng)填寫的
  16. Endstream      #流對(duì)象結(jié)束標(biāo)志
  17. Endobj
  18. 8 0 obj
  19. <<
  20. /Contents 7 0 R              #頁面內(nèi)容對(duì)象的對(duì)象號(hào)為7
  21. /MediaBox [0 0 595.2 841.68] #頁面顯示大小,以像素為單位
  22. /PageIndex 1
  23. /Parent 1 0 R               #其父對(duì)象號(hào)為1以及Pages對(duì)象
  24. /Resources                  #該頁包含的資源
  25. <>      #字體的類型
  26. /Shading <<>>
  27. /XObject <<>>               #外部對(duì)象
  28. /ColorSpace <> 
  29. >>
  30. /Type /Page
  31. >>
  32. Endobj
  33. 1 0 obj
  34. <<
  35. /Count 1        #頁碼數(shù)量為1
  36. /Kids [8 0 R ]  #kids對(duì)象說明它的子頁對(duì)象為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表明引用表描述的對(duì)象編號(hào)從0開始,8說明共有8個(gè)對(duì)象#此行在交叉引用表中可出現(xiàn)多個(gè)
  49. 0000000000 65536 f #一般pdf都是以這行開始交叉引用表的,起始地址0和產(chǎn)生號(hào)
  50. 0000003195 00000 n #表示對(duì)象1,就是catalog,3195為偏移地址n表示對(duì)象在使用
  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      #說明文件尾對(duì)象開始
  64. <
  65. /Root 12 0 R #說明跟對(duì)象號(hào)為12
  66. /Info 13 0 R>>
  67. startxref
  68. 8980     #8980為交叉引用表的偏移地址,此處為十進(jìn)制表示
  69. %%EOF    #文件結(jié)束標(biāo)志

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

 
 
 
 
  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

即交叉引用表中第五行順序數(shù)為4的對(duì)象,其偏移為4976

四、Pdf文件混淆

如圖,下面的樣本進(jìn)行了混淆

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

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

 
 
 
 
  1. 1 0 obj
  2. <
  3. Catalog>>
  4. endobj

五、關(guān)鍵字

下面介紹了PDF文件解析時(shí)所需要的關(guān)鍵字

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

六、流的提取

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

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

一共包括上面幾種編碼方式,按常見順序進(jìn)行了排序,可以級(jí)聯(lián)編碼。例如:

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

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

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

七、一些坑

PDF的惡意攻擊樣本毫無疑問會(huì)使用一些特殊手段對(duì)抗殺軟的掃描檢查,下面統(tǒng)計(jì)了一下惡意樣本常見的規(guī)避行為:

1. 交叉引用表

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

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

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

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

 
 
 
 
  1. xref
  2. 0 4
  3. 0000000000 65535 f
  4. 0000000000 65536 n
  5. 0000039095 00000 n
  6. 0000000015 00000 n
  7. trailer
  8. <
  9. [<386e381fac5d8245e24ee620741d0d06>]/Root
  10. 26 0 R/Size 28/Info 27 0 R>>
  11. startxref
  12. 39630
  13. %%EOF
  14. <
  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. <
  32. R/ID[<386E381FAC5D8245E24EE620741D0D06><39FE58436C8CC909F538F88909F1EE55>]/Size
  33. 63/Prev 39630>>
  34. startxref
  35. 173446
  36. %%EOF

樣本如上,正常來講,一個(gè)文檔只存在一個(gè)%EOF結(jié)束符,但是這個(gè)樣本里出現(xiàn)了兩個(gè)

2. 字符串長(zhǎng)度

(1) 坑1 流對(duì)象長(zhǎng)度可以直接跟對(duì)象

正常一個(gè)字典語句中/Length之后的數(shù)值代表stream~endstream兩個(gè)關(guān)鍵字之間流的長(zhǎng)度,如下

 
 
 
 
  1. 7 0 obj
  2. <>
  3. stream

但測(cè)試發(fā)現(xiàn)流的長(zhǎng)度可以是obj對(duì)象

 
 
 
 
  1. 2 0 obj
  2. << /Length 4 0 R /Filter
  3. /FlateDecode >>
  4. #對(duì)應(yīng)的obj對(duì)象中包含的長(zhǎng)度如下
  5. 4 0 obj
  6. 4880
  7. endobj

所以stream流對(duì)象壓縮前的實(shí)際長(zhǎng)度為4880雖然是PDF格式的正規(guī)使用方法,但同時(shí)也是規(guī)避殺軟的一種手法。

(2) 坑2 流對(duì)象長(zhǎng)度可以為任意值

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

同理,正常流對(duì)象長(zhǎng)度為上圖,實(shí)際測(cè)試發(fā)現(xiàn)樣本

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

WTF is ANIWAY_LEN??? 長(zhǎng)度可以為填ascii字符???所以,/Length后面可以不跟數(shù)值stream流的實(shí)際長(zhǎng)度實(shí)際==關(guān)鍵字endstream偏移-關(guān)鍵字stream偏移-包含的0x0D或0x0A

3. 解碼問題

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

 
 
 
 
  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. }
  22. padding_0c = "MM0c0cMM0c0c";
  23. padding00="MM0000";
  24. padding_41 = "MM4141";
  25. var x1=0;
  26. var x2=0;
  27. var x3=0;
  28. endstream
  29. endobj

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

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

 
 
 
 
  1. 1 0 obj
  2. <
  3. >>
  4. Stream
  5. x?íüYXù
  6. ÷q?ì0K3??R?VdoU?Q"[M!S(íRó?0–h¥B*d?h?~5′?
  7. endstream

正常文件默認(rèn)/Filter關(guān)鍵字之后會(huì)出現(xiàn)xxdecode關(guān)鍵字表示stream流編碼方式,但測(cè)試發(fā)現(xiàn)樣本可以沒有xxdecode關(guān)鍵字,但同樣進(jìn)行了編碼處理,如上/Fl字段即為/FlateDecode的簡(jiǎn)寫,對(duì)應(yīng)表如下:

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

(3) 坑3 編碼形式可以級(jí)聯(lián)

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

如上表示流先經(jīng)過了ASCIIHex加密再進(jìn)行了FlateDecode加密解碼時(shí)需要先進(jìn)行FlateDecode解密之后再進(jìn)行ASCIIHexDecode解密

八、常用分析工具推薦

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

1. PdfStreamDumper

  • stream流解析工具
  • vb開源項(xiàng)目。工具存在一些bug,無法解析級(jí)聯(lián)編碼后的stream流,例如/Fl/Fl編碼就無法解析

2. PDFParser

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

3. ParanoiDF

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

4. References

  • PDF, let me count the way...
  • Cryin/PDFTear
  • Adobe PDF 官方文檔
  • Malicious Document PDF analysis in 5 steps
  • C#實(shí)現(xiàn)的PDF解析器

網(wǎng)站欄目:PDF文件解析與PDF惡代分析中的一些坑
當(dāng)前路徑:http://www.5511xx.com/article/cdspcie.html