第一章:恶意软件静态分析基础
文章目錄
- 前言
- 1、數據集
- 2、Windows可移植可執行文件格式
- 3、使用pefile解析PE文件格式
- 4、獲取惡意軟件的圖像
- 5、獲取惡意軟件的字符串
- 6、反匯編技術
- 6.1、使用pefile和capstone反匯編ircbot.exe
- 7、限制靜態分析的因素
前言
??靜態分析可以幫助我們更好地理解惡意軟件二進制文件在攻擊目標后為攻擊者提供的好處,以及攻擊者可以隱藏并繼續攻擊受感染計算機的方式。
1、數據集
數據集下載地址
ircbot.exe : 互聯網中繼聊天(Internet Relay Chat)機器人。當連接到IRC服務器時,程序被設計常駐在目標計算機中,在ircbot.exe控制目標后,攻擊者可以通過IRC控制目標計算機,執行控制指令,例如打開網絡攝像頭偷偷捕獲視頻、提取目標的地理位置和桌面的截圖,以及從目標機器中提取相關文件等。
fakepdfmalware.exe:此樣本使用Adobe Acrobat圖標誘騙用戶認為它是一個Adobe Acrobat文檔,而實際上它是一個惡意的PE可執行文件。
2、Windows可移植可執行文件格式
??Windows PE文件格式描述了如.exe、.dll和.sys等當今Windows程序文件的結構,并定義了它們存儲數據的方式。PE文件包含x86指令、圖像和文本等數據,以及程序運行所需要的元數據。Windows使用這些安全數據來確保代碼出自受信任的來源。下圖為PE文件格式:
??PE文件格式包括一系列的header,用來告訴操作系統如何將程序加載到內存中。它還包括一系列的節用來包含實際的程序數據。Windows將這些節加載到內存中,使其在內存中的偏移量與他們在磁盤上的顯示位置向對應。PE頭
定義了程序的一般屬性,如二進制代碼、圖像、壓縮數據和其它程序屬性。告訴我們程序是針對32位或64位系統而設計的。頭里包括了時間戳字段,可以給出惡意軟件作者編譯文件的時間, 通常惡意軟件作者會使用偽造的值替代這個字段。
可選頭
定義了PE文件中程序入口的位置,該位置指的是程序加載后運行的第一個指令,還定義了Windows在加載PE文件、Windows子系統、目標程序時加載到內存中的數據的大小,以及有關該程序其他的高級詳細信息。
節頭
節頭描述了PE文件中包含的數據節。PE文件中的一個節是一塊數據,它們在操作系統加載程序時將被映射到內存中,或者包含有關如何將程序加載到內存中的指令。節頭還告訴Windows應該授予哪些權限,例如x86代碼的.text節通常是可讀和可執行的,但不可寫,防止程序代碼在執行過程中意外修改自身。
.text節
每一個PE程序在其節頭中包含了至少一個標記為可執行的x86代碼節;這些節幾乎總是命名為.text,在執行程序反匯編和逆向工程時,將反匯編.text節中的數據。
.idata節
被稱為導入節,包含導入地址表(IAT), 它列出了動態鏈接庫和它們的函數。IAT是最重要的PE結構之一,在對PE二進制文件進行最初的分析時需要查看它,因為它指出了程序所調用的庫,這些調用反過來又可能會泄露惡意軟件的高級功能。
.rsrc節
.rsrc節包含了程序用于將文本呈現為字符串的可打印字符串。
.reloc節
PE二進制文件的代碼并非是與位置獨立的,這意味著如果將它從預期的內存位置移動到新的內存位置,它將無法正確執行。.reloc節在不破壞代碼的情況下通過允許移動代碼來解決這個問題。
3、使用pefile解析PE文件格式
代碼如下:
import pefile#實例化pefile.PE,通過調用PE構造函數,加載并解析指定的PE文件 pe = pefile.PE("ircbot.exe")#遍歷PE文件的各個節點并打印有關它們的信息 for section in pe.sections:print (section.Name, hex(section.VirtualAddress), hex(section.Misc_VirtualSize), section.SizeOfRawData)''' 輸出b'.text\x00\x00\x00' 0x1000(加載節的虛擬內存地址基址,也可以視為節的內存地址基址) 0x32830(指定了節被加載后所需的內存大小) 207360(該節將在該內存塊中所占用的數據量) b'.rdata\x00\x00' 0x34000 0x427a 17408 b'.data\x00\x00\x00' 0x39000 0x5cff8 10752 b'.idata\x00\x00' 0x96000 0xbb0 3072 b'.reloc\x00\x00' 0x97000 0x211d 8704 '''#使用pefile列出二進制文件將加載的DLL文件, 以及它將在這些DLL文件中所請求的函數調用。#從ircbot.exe中提取導入信息 for entry in pe.DIRECTORY_ENTRY_IMPORT:print (entry.dll)for function in entry.imports:print ('\t', function.name)#輸出 列出了惡意軟件聲明和將引用的豐富的函數數組 ''' b'KERNEL32.DLL'b'GetLocalTime'b'ExitThread'b'CloseHandle'b'WriteFile' b'CreateFileA'b'ExitProcess'b'CreateProcessA'b'GetTickCount'b'GetModuleFileNameA'b'GetSystemDirectoryA'b'Sleep'b'GetTimeFormatA'b'GetDateFormatA'b'GetLastError'b'CreateThread'b'GetFileSize'b'GetFileAttributesA'b'FindClose'b'FileTimeToSystemTime'b'FileTimeToLocalFileTime'b'FindNextFileA'b'FindFirstFileA'b'ReadFile'b'SetFilePointer'b'WriteConsoleA'b'GetStdHandle'b'LoadLibraryA'b'GetProcAddress'b'GetModuleHandleA'b'FormatMessageA'b'GlobalUnlock'b'GlobalLock'b'UnmapViewOfFile'b'MapViewOfFile'b'CreateFileMappingA'b'SetFileTime'b'GetFileTime'b'ExpandEnvironmentStringsA'b'SetFileAttributesA'b'GetTempPathA'b'GetCurrentProcess'b'TerminateProcess'b'OpenProcess'b'GetComputerNameA'b'GetLocaleInfoA'b'GetVersionExA'b'TerminateThread'b'FlushFileBuffers'b'SetStdHandle'b'IsBadWritePtr'b'IsBadReadPtr'b'HeapValidate'b'GetStartupInfoA'b'GetCommandLineA'b'GetVersion'b'DebugBreak'b'InterlockedDecrement'b'OutputDebugStringA'b'InterlockedIncrement'b'HeapAlloc'b'HeapReAlloc'b'HeapFree'b'HeapDestroy'b'HeapCreate'b'VirtualFree'b'VirtualAlloc'b'WideCharToMultiByte'b'MultiByteToWideChar'b'LCMapStringA'b'LCMapStringW'b'GetCPInfo'b'GetACP'b'GetOEMCP'b'UnhandledExceptionFilter'b'FreeEnvironmentStringsA'b'FreeEnvironmentStringsW'b'GetEnvironmentStrings'b'GetEnvironmentStringsW'b'SetHandleCount'b'GetFileType'b'RtlUnwind'b'SetConsoleCtrlHandler'b'GetStringTypeA'b'GetStringTypeW'b'SetEndOfFile' b'USER32.dll'b'MessageBoxA' '''# 3、使用pefile解析PE文件格式## 2.讀入數據<font color=#999AAA >代碼如下(示例):```c data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())4、獲取惡意軟件的圖像
??要了解惡意軟件如何設計來捉弄攻擊目標,就可以查看它的.rsrc節中所包含的圖標。使用wrestool(0.32.3)從fakepdfmalware.exe中提取圖像資源保存為.icon格式,并使用icotool轉換為png圖像。
5、獲取惡意軟件的字符串
??字符串是程序二進制文件中可打印字符的序列。這些字符串通常包含下載網頁和文件的HTTP和FTP命令,用來告訴你惡意軟件連接到的地址的IP地址和主機名等類似信息。有時,即使用來編寫字符串的語言也有可能暗示惡意軟件二進制文件的來源國,盡管可能是偽造的。甚至可以在一個字符串中找到一些文本,它們用網絡用語解析了惡意二進制文件的用途。
??字符串還可以顯示有關二進制文件的更多技術信息。例如,創建二進制文件的編譯器、編寫二進制文件所使用的編程語言、嵌入式腳本或HTML等信息。雖然惡意軟件作者可以對所有這些痕跡進行混淆、加密和壓縮等處理,但是即便是高水平的惡意軟件作者也經常會暴露并留下一些痕跡。
將ircbot.exe中的字符串鏡像到ircbotstring.txt文件中。
6、反匯編技術
??反匯編是將惡意軟件的二進制代碼轉換為有效的x86匯編語言的過程。惡意軟件作者通常使用C/C++等高級語言編寫惡意軟件程序,然后使用編譯器將源代碼進行編譯成x86二進制代碼。但是,反匯編并非易事,因為惡意軟件作者經常使用一些技巧來阻撓逆向工程。由于目前要達到完美的反匯編是不可能的,我們必須使用不完善的方法來完成這項任務,使用的方法是線性反匯編,這涉及到PE文件中識別哪些與其x86程序代碼相對應的連續字節序列,然后解碼這些字節。這種方法主要的局限性是它忽略了CPU在程序執行過程中如何解碼指令的細微差別。此外,它也無法解析惡意軟件作者有時使用的使程序更難分析的各種混淆。
6.1、使用pefile和capstone反匯編ircbot.exe
使用開源python庫pefile和capstone,這是一個可以反匯編32位x86二進制代碼的開源反匯編庫。反匯編ircbot.exe匯編代碼的前100個字節。
#!usr/bin/python3 #-*- coding:utf-8 -*- import pefile from capstone import *#反匯編ircbot.exe#加載目標PE文件 pe = pefile.PE("ircbot.exe")#從程序頭中獲取程序入口點的地址 entrypoint = pe.OPTIONAL_HEADER.AddressOfEntryPoint#計算入口代碼被加載到內存中的內存地址 entrypoint_address = entrypoint + pe.OPTIONAL_HEADER.ImageBase#從PE文件對象獲取二進制代碼 binary_code = pe.get_memory_mapped_image()[entrypoint:entrypoint+100]#初始化反匯編程序以反匯編32位x86二進制代碼 disassembler = Cs(CS_ARCH_X86, CS_MODE_32)#反匯編代碼 for instruction in disassembler.disasm(binary_code, entrypoint_address):print ("%s\t%s"%(instruction.mnemonic, instruction.op_str))#結果 ''' dec ecx add byte ptr [ebx + 0x494634], ah mov eax, dword ptr [0x494634] shr eax, 8 and eax, 0xff mov dword ptr [0x494640], eax mov ecx, dword ptr [0x494634] and ecx, 0xff mov dword ptr [0x49463c], ecx mov edx, dword ptr [0x49463c] shl edx, 8 add edx, dword ptr [0x494640] mov dword ptr [0x494638], edx mov eax, dword ptr [0x494634] shr eax, 0x10 and eax, 0xffff mov dword ptr [0x494634], eax push 0 call 0x414190 add esp, 4 test eax, eax jne 0x412224 push 0x1c '''7、限制靜態分析的因素
加殼、資源混淆、反匯編技術、動態下載數據。
總結
以上是生活随笔為你收集整理的第一章:恶意软件静态分析基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux设备驱动入门----globa
- 下一篇: 第27周六