天天看點

神操作:教你用Python識别惡意軟體

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

神操作:教你用Python識别惡意軟體

在本文中,我們将介紹惡意軟體靜态分析的基礎知識。靜态分析是對程式檔案的反彙編代碼、圖形圖像、可列印字元串和其他磁盤資源進行分析,是一種不需要實際運作程式的逆向工程。雖然靜态分析技術有欠缺之處,但是它可以幫助我們了解各種各樣的惡意軟體。

通過細緻的逆向工程,你将能夠更好地了解惡意軟體二進制檔案在攻擊目标後為攻擊者提供的好處,以及攻擊者可以隐藏并繼續攻擊受感染計算機的方式。正如你将看到的,本文結合了描述和執行個體,每個部分都介紹了靜态分析技術,然後說明其在實際分析中的應用。

本文的代碼和資料,可以在公衆号背景回複惡意軟體擷取下載下傳方式。你将在資料目錄/ch1中找到本文示例中使用的惡意軟體示例。為了示範本文讨論的技術,我們在示範中使用ircbot.exe,這是一個網際網路中繼聊天(Internet Relay Chat,IRC)機器人,也在日常廣泛監測中最常見的惡意軟體的示例之一。

嚴格來說,當連接配接到IRC伺服器時,這個程式被設計常駐在目标計算機上。在ircbot.exe控制目标後,攻擊者可以通過IRC控制目标計算機,執行控制指令,例如打開網絡攝像頭偷偷捕獲視訊、提取目标的地理位置和桌面的截圖,以及從目标機器中提取相關檔案等。

01 微軟Windows可移植可執行檔案格式

要進行惡意軟體靜态分析,你需要了解Windows PE檔案格式,該格式描述了如.exe、.dll和.sys等當今Windows程式檔案的結構,并定義了它們存儲資料的方式。PE檔案包含x86指令、圖像和文本等資料,以及程式運作所需的中繼資料。

PE格式最初的設計是用來進行下面的操作。

1)告訴Windows如何将程式加載到記憶體中

PE格式描述了檔案的哪些塊應該加載到記憶體中,以及在哪裡加載。它還告訴你,Windows應該在程式代碼裡的哪個位置開始執行程式,以及哪些動态連結代碼庫應該加載到記憶體中。

2)為運作程式提供在執行過程中可能使用的媒體(或資源)

這些資源可以包括字元串,如GUI對話框或控制台輸出的字元串,以及圖像或視訊。

3)提供安全資料,例如數字代碼簽名

Windows使用這些安全資料來確定代碼出自受信任的來源。

PE格式通過利用圖1-1中所示的一系列結構來完成以上工作。

神操作:教你用Python識别惡意軟體

如圖1-1所示,PE檔案格式包括一系列頭(header),用來告訴作業系統如何将程式加載到記憶體中。它還包括一系列節(section)用來包含實際的程式資料。Windows将這些節加載到記憶體中,使其在記憶體中的偏移量與它們在磁盤上的顯示位置相對應。

讓我們從PE頭開始,來更詳細地探讨這個檔案結構。我們将略過對DOS頭的讨論,這是20世紀80年代微軟DOS作業系統的遺留産物,僅僅出于相容性原因而存在。

1.PE頭

如圖1-1底部所示,在DOS頭❶的上面是PE頭❷,它定義了程式的一般屬性,如二進制代碼、圖像、壓縮資料和其他程式屬性。它還告訴我們程式是否是針對32位或64位系統而設計的。

PE頭為惡意軟體分析師提供了基本但有用的情景資訊。例如,頭裡包括了時間戳字段,這個字段可以給出惡意軟體作者編譯檔案的時間。通常惡意軟體作者會使用僞造的值替換這個字段,但是有時惡意軟體作者會忘記替換,就會發生這種情況。

2.可選頭

可選頭❸實際上在今天的PE可執行程式中無處不在,恰恰與其名稱的含義相反。它定義了PE檔案中程式入口點的位置,該位置指的是程式加載後運作的第一個指令。

它還定義了Windows在加載PE檔案、Windows子系統、目标程式(例如Windows GUI或Windows指令行)時加載到記憶體中的資料大小,以及有關該程式其他的進階詳細資訊。由于程式的入口點告訴了逆向工程師該從哪裡開始進行逆向工程,這個頭資訊對逆向工程師來說是非常寶貴的。

3.節頭

節(section)頭❹描述了PE檔案中包含的資料節。PE檔案中的一個節是一塊資料,它們在作業系統加載程式時将被映射到記憶體中,或者包含有關如何将程式加載到記憶體中的指令。

換句話說,一個節是磁盤上的位元組序列,它要麼成為記憶體中一串連續位元組的字元串,要麼告知作業系統關于加載過程的某些方面。

節頭還告訴Windows應該授予節哪些權限,比如程式在執行時,是否應該可讀、可寫或可執行。例如,包含x86代碼的.text節通常被标記為可讀和可執行的,但是不可寫的,以防止程式代碼在執行過程中意外修改自身。

圖1-1描述了許多節,如.text和.rsrc。執行PE檔案時,它們會被映射到記憶體中。其他如.reloc節的特殊節不會被映射到記憶體中,我們也将讨論這些節。下面我們來浏覽圖1-1中顯示的節。

1).text節

每個PE程式在其節頭中包含了至少一個标記為可執行的x86代碼節;這些節幾乎總是命名為.text❺。

2).idata節

.idata節❻,也被稱為導入節,包含導入位址表(IAT),它列出了動态連結庫和它們的函數。IAT是最重要的PE結構之一,在對PE二進制檔案進行最初的分析時需要檢視它,因為它指出了程式所調用的庫,然而這些調用反過來又可能會洩露惡意軟體的進階功能。

3)資料節

在PE檔案結構中的資料節可以包括.rsrc、.data和.rdata等節,它們存儲程式使用的滑鼠光标圖像、按鈕圖示、音頻和其他媒體等。例如,圖1-1中的.rsrc節❼包含了程式用于将文本呈現為字元串的可列印字元串。

.rsrc(資源)節中的資訊對惡意軟體分析師是非常重要的,因為通過檢查PE檔案中的可列印字元串、圖形圖像和其他資産,他們可以獲得關于檔案功能的重要線索。

在03節中,你将了解如何使用icoutils工具包(包括icotool和wrestool)從惡意軟體二進制檔案的資源節中提取圖形圖像。然後,在04節中,你将學習如何從惡意軟體資源節中提取可列印的字元串。

4).reloc節

PE二進制檔案的代碼并非是與位置獨立的,這意味着如果将它從預期的記憶體位置移動到新的記憶體位置,它将無法正确執行。.reloc❽在不破壞代碼的情況下通過允許移動代碼來解決這個問題。

如果一個PE檔案的代碼已被移動,它就告訴Windows作業系統将該檔案的代碼中進行記憶體位址轉換,這樣代碼仍可以正确運作。這些轉換通常涉及在記憶體位址中添加或減去偏移量。

02 使用pefile解析PE檔案格式

由Ero Carerra編寫和維護的Python子產品pefile已經成為解析PE檔案的一個行業标準的惡意軟體分析庫。在本節中,我将向你展示如何使用pefile來解析ircbot.exe。代碼清單1-1假設ircbot.exe已位于你目前的工作目錄中。

輸入以下指令安裝pefile庫,以便我們可以在Python中導入它:

$ pip install pefile           

現在,使用代碼清單1-1中的指令啟動Python,導入pefile子產品,然後使用pefile打開并解析PE檔案ircbot.exe。

  • 代碼清單1-1 加載pefile子產品并解析PE檔案(ircbot.exe)
$ python
>>> import pefile
>>> pe = pefile.PE("ircbot.exe")           

我們執行個體化pefile.PE,它是PE子產品實作的核心類。它解析PE檔案,以便我們可以檢視它們的屬性。通過調用PE構造函數,我們加載并解析指定的PE檔案,在本例中為ircbot.exe。現在我們已經加載并解析了這個檔案,運作代碼清單1-2中的代碼從ircbot.exe的pe字段中提取資訊。

  • 代碼清單1-2 周遊PE檔案的各個節并列印有關它們的資訊
#基于 Ero Carrera的示例代碼(pefile庫的作者)
for section in pe.sections:
  print(section.Name, hex(section.VirtualAddress),
    hex(section.Misc_VirtualSize), section.SizeOfRawData)           

代碼清單1-3顯示了列印輸出的内容。

  • 代碼清單1-3 使用Python的pefile子產品從ircbot.exe中提取節資料
神操作:教你用Python識别惡意軟體

如代碼清單1-3所示,我們從PE檔案五個不同的節中提取了資料:.text、.rdata、.data、.idata和.reloc。輸出是以五元組的形式給出,每提取一個PE節對應一個元素。每一行的第一個條目辨別PE節。(你可以忽略一系列的x00空位元組,它們隻是C語言樣式的空字元串終止符。)其餘字段告訴我們,一旦将每個節被加載到記憶體中,它的記憶體使用率将是多少,以及一旦被加載,它将在記憶體中的何處被找到。

例如,0x1000❶是加載這些節的虛拟記憶體位址基址,也可以将其視為節的記憶體位址基址。在虛拟大小(virtual size)字段中的0x32830❷指定了節被加載後所需的記憶體大小。第三個字段中的207360❸表示該節将在該記憶體塊中所占用的資料量。

除了使用pefile解析程式的節之外,我們還可以使用它列出二進制檔案将加載的DLL檔案,以及它将在這些DLL檔案中所請求的函數調用。我們可以通過鏡像(dump)PE檔案的IAT來實作這一點。代碼清單1-4顯示了如何使用pefile鏡像ircbot.exe的IAT。

  • 代碼清單1-4 從ircbot.exe中提取導入資訊
$ python
pe = pefile.PE("ircbot.exe")
for entry in pe.DIRECTORY_ENTRY_IMPORT:
    print entry.dll
    for function in entry.imports:
        print '\t', function.name           

代碼清單1-4會生成如代碼清單1-5所示的輸出(為了簡潔起見,輸出進行了截斷)。

  • 代碼清單1-5 ircbot.exe的IAT表内容,其顯示了這個惡意軟體使用的庫函數
神操作:教你用Python識别惡意軟體

如代碼清單1-5所示,這個輸出對于惡意軟體分析很有價值,因為它列出了惡意軟體聲明和将引用的豐富的函數數組。

例如,輸出的前幾行告訴我們,惡意軟體将使用WriteFile❶寫入檔案,使用CreateFileA❷打開檔案,并使用CreateProcessA❸建立新的程序。雖然這些隻是關于惡意軟體的基本資訊,但它們是了解惡意軟體更為詳細行為的開始。

03 檢查惡意軟體的圖檔

要了解惡意軟體是如何設計來捉弄攻擊目标的,讓我們看看在它的.rsrc節中所包含的圖示。例如,惡意軟體二進制檔案常常被設計成僞裝的Word文檔、遊戲安裝程式、PDF檔案等常用軟體的圖示來欺騙使用者點選它們。

你還可以在惡意軟體中找到攻擊者自己感興趣程式中的圖像,例如攻擊者為遠端控制受感染機器而運作的網絡攻擊工具和程式。

回到我們的樣本圖像分析,你可以在本文的資料目錄中找到名為fakepdfmalware.exe的這個惡意軟體樣本。這個樣本使用Adobe Acrobat圖示誘騙使用者認為它是一個Adobe Acrobat文檔,而實際上它是一個惡意的PE可執行檔案。

在我們使用Linux指令行工具wrestool從二進制檔案fakepdfmalware.exe中提取圖像之前,我們首先需要建立一個目錄來儲存我們将提取的圖像。代碼清單1-6顯示了如何完成所有這些操作。

  • 代碼清單1-6 從惡意軟體樣本中提取圖像的Shell指令
$ mkdir images
$ wrestool -x fakepdfmalware.exe -output=images
$ icotool -x -o images images/*.ico           

我們首先使用mkdir images建立一個目錄來儲存提取的圖像。接下來,我們使用wrestool從fakepdfmalware.exe中提取圖像資源(-x)到/images目錄,然後使用icotool提取(-x)并将Adobe中.ico圖示格式中的所有資源轉換(-o)為.png圖形,以便我們可以使用标準的圖像浏覽工具檢視它們。

如果你的系統上沒有安裝wrestool,你可以從這裡下載下傳:

http://www.nongnu.org/icoutils/

一旦你使用wrestool将目标可執行檔案中的圖像轉換為PNG格式,你就可以在你喜歡的圖像浏覽工具中打開它們,并以各種分辨率檢視Adobe Acrobat圖示。

正如我在這裡給出的例子所示,從PE檔案中提取圖像和圖示相對簡單,可以快速顯示與惡意軟體二進制檔案相關的有趣且又有用的資訊。同樣地,我們可以輕松地從惡意軟體中提取可列印字元串來擷取更多資訊,我們接下來會做這項工作。

04 檢查惡意軟體的字元串

字元串是程式二進制檔案中可列印字元的序列。惡意軟體分析師通常依賴惡意樣本中的字元串來快速了解其中可能發生的情況。這些字元串通常包含下載下傳網頁和檔案的HTTP和FTP指令,用于告訴你惡意軟體連接配接到的位址的IP位址和主機名等類似資訊。

有時,即使用于編寫字元串的語言也有可能暗示惡意軟體二進制檔案的來源國,盡管這可能是僞造的。你甚至可以在一個字元串中找到一些文本,它們用網絡用語解釋了惡意二進制檔案的用途。

字元串還可以顯示有關二進制檔案的更多技術資訊。例如,你可能會發現有關用于建立二進制檔案的編譯器、編寫二進制檔案所使用的程式設計語言、嵌入式腳本或HTML等資訊。

雖然惡意軟體作者可以對所有這些痕迹進行混淆、加密和壓縮等處理,但是即便是高水準的惡意軟體作者也經常會暴露并留下一些痕迹,是以在分析惡意軟體時,對鏡像的字元串進行細緻檢查顯得尤為重要。

1.使用字元串程式

檢視檔案中所有字元串的标準方法是使用指令行工具strings,按照以下文法進行使用:

$ strings filepath | less           

該指令将檔案中的所有字元串逐行列印到終端上。在末尾添加 | less可以防止字元串在終端上跨屏顯示。預設情況下,strings指令查找所有最小長度為4位元組的可列印字元串,但是你可以設定不同的最小長度并更改“指令手冊”中所列各種其他參數。

我建議隻使用預設的最小字元串長度4,但是你可以使用-n選項更改最小字元串長度。例如,“string -n 10 filepath”隻提取最小長度為10位元組的字元串。

2.分析鏡像字元串

現在我們鏡像了一個惡意軟體程式的可列印字元串,但是挑戰在于要了解這些字元串的含義。例如,假設我們将ircbot.exe中的字元串鏡像到ircbotstring.txt檔案中,這在本文前面的内容中,我們使用pefile庫已經進行了探讨,如下所示:

$ strings ircbot.exe > ircbotstring.txt           

ircbotstring.txt的内容包含數千行文本,但其中一些行應該突出顯示出來。例如,代碼清單1-7顯示了從字元串鏡像中提取出來的一串以單詞DOWNLOAD開頭的行。

  • 代碼清單1-7 顯示惡意軟體可以将攻擊者指定的檔案下載下傳到目标計算機的字元串輸出
神操作:教你用Python識别惡意軟體

這些行表示ircbot.exe将嘗試把攻擊者指定的檔案下載下傳到目标計算機上。

我們來嘗試分析另一個。代碼清單1-8所示的字元串鏡像表明ircbot.exe可以起到Web伺服器的作用,在目标機器上偵聽來自攻擊者的連接配接。

  • 代碼清單1-8 顯示惡意軟體有一個攻擊者可以連接配接的HTTP伺服器的字元串輸出
神操作:教你用Python識别惡意軟體

代碼清單1-8顯示了ircbot.exe用于實作HTTP伺服器的各種HTTP樣闆程式。此HTTP伺服器可能允許攻擊者通過HTTP連接配接到目标計算機以發出指令,例如擷取受害者桌面的螢幕截圖并将其回傳給攻擊者的指令。

我們在整個代碼清單中看到了HTTP功能的證據。例如,從Internet資源請求資料的GET方法❶。HTTP/1.0 200 OK❷這一行是一個傳回狀态代碼200的HTTP字元串,表明HTTP網絡事務都運作良好,而Server:myBot❸表明HTTP伺服器的名稱是myBot,這是ircbot.exe附加的一個内置HTTP伺服器。

所有這些資訊都有助于了解和阻止特定的惡意軟體樣本或惡意活動。例如,知道惡意軟體樣本有一個HTTP伺服器,當你連接配接到它時,它會輸出特定的字元串,這樣你就可以借此掃描你的網絡來識别受感染的主機。

05 小結

在本文中,你大緻對靜态惡意軟體分析有了一定的認識,其中包括在不實際運作的情況下檢查惡意軟體程式。

你了解了定義Windows作業系統.exe和.dll檔案的PE檔案格式,還了解了如何使用Python庫pefile解析實際場景中的惡意軟體ircbot.exe二進制檔案。

你還使用圖像分析和字元串分析等靜态分析技術,從惡意軟體樣本中提取更多的資訊。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/zhibo

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-04-08

本文作者:約書亞·薩克斯(Joshua Saxe)、希拉裡·桑德斯(Hillary Sanders)

本文來自:“

大資料DT 微信公衆号

”,了解相關資訊可以關注“

大資料DT