第一章:恶意软件静态分析基础
文章目錄
- 前言
- 1、數(shù)據(jù)集
- 2、Windows可移植可執(zhí)行文件格式
- 3、使用pefile解析PE文件格式
- 4、獲取惡意軟件的圖像
- 5、獲取惡意軟件的字符串
- 6、反匯編技術(shù)
- 6.1、使用pefile和capstone反匯編ircbot.exe
- 7、限制靜態(tài)分析的因素
前言
??靜態(tài)分析可以幫助我們更好地理解惡意軟件二進(jìn)制文件在攻擊目標(biāo)后為攻擊者提供的好處,以及攻擊者可以隱藏并繼續(xù)攻擊受感染計(jì)算機(jī)的方式。
1、數(shù)據(jù)集
數(shù)據(jù)集下載地址
ircbot.exe : 互聯(lián)網(wǎng)中繼聊天(Internet Relay Chat)機(jī)器人。當(dāng)連接到IRC服務(wù)器時(shí),程序被設(shè)計(jì)常駐在目標(biāo)計(jì)算機(jī)中,在ircbot.exe控制目標(biāo)后,攻擊者可以通過IRC控制目標(biāo)計(jì)算機(jī),執(zhí)行控制指令,例如打開網(wǎng)絡(luò)攝像頭偷偷捕獲視頻、提取目標(biāo)的地理位置和桌面的截圖,以及從目標(biāo)機(jī)器中提取相關(guān)文件等。
fakepdfmalware.exe:此樣本使用Adobe Acrobat圖標(biāo)誘騙用戶認(rèn)為它是一個(gè)Adobe Acrobat文檔,而實(shí)際上它是一個(gè)惡意的PE可執(zhí)行文件。
2、Windows可移植可執(zhí)行文件格式
??Windows PE文件格式描述了如.exe、.dll和.sys等當(dāng)今Windows程序文件的結(jié)構(gòu),并定義了它們存儲(chǔ)數(shù)據(jù)的方式。PE文件包含x86指令、圖像和文本等數(shù)據(jù),以及程序運(yùn)行所需要的元數(shù)據(jù)。Windows使用這些安全數(shù)據(jù)來確保代碼出自受信任的來源。下圖為PE文件格式:
??PE文件格式包括一系列的header,用來告訴操作系統(tǒng)如何將程序加載到內(nèi)存中。它還包括一系列的節(jié)用來包含實(shí)際的程序數(shù)據(jù)。Windows將這些節(jié)加載到內(nèi)存中,使其在內(nèi)存中的偏移量與他們?cè)诖疟P上的顯示位置向?qū)?yīng)。PE頭
定義了程序的一般屬性,如二進(jìn)制代碼、圖像、壓縮數(shù)據(jù)和其它程序?qū)傩浴8嬖V我們程序是針對(duì)32位或64位系統(tǒng)而設(shè)計(jì)的。頭里包括了時(shí)間戳字段,可以給出惡意軟件作者編譯文件的時(shí)間, 通常惡意軟件作者會(huì)使用偽造的值替代這個(gè)字段。
可選頭
定義了PE文件中程序入口的位置,該位置指的是程序加載后運(yùn)行的第一個(gè)指令,還定義了Windows在加載PE文件、Windows子系統(tǒng)、目標(biāo)程序時(shí)加載到內(nèi)存中的數(shù)據(jù)的大小,以及有關(guān)該程序其他的高級(jí)詳細(xì)信息。
節(jié)頭
節(jié)頭描述了PE文件中包含的數(shù)據(jù)節(jié)。PE文件中的一個(gè)節(jié)是一塊數(shù)據(jù),它們?cè)诓僮飨到y(tǒng)加載程序時(shí)將被映射到內(nèi)存中,或者包含有關(guān)如何將程序加載到內(nèi)存中的指令。節(jié)頭還告訴Windows應(yīng)該授予哪些權(quán)限,例如x86代碼的.text節(jié)通常是可讀和可執(zhí)行的,但不可寫,防止程序代碼在執(zhí)行過程中意外修改自身。
.text節(jié)
每一個(gè)PE程序在其節(jié)頭中包含了至少一個(gè)標(biāo)記為可執(zhí)行的x86代碼節(jié);這些節(jié)幾乎總是命名為.text,在執(zhí)行程序反匯編和逆向工程時(shí),將反匯編.text節(jié)中的數(shù)據(jù)。
.idata節(jié)
被稱為導(dǎo)入節(jié),包含導(dǎo)入地址表(IAT), 它列出了動(dòng)態(tài)鏈接庫和它們的函數(shù)。IAT是最重要的PE結(jié)構(gòu)之一,在對(duì)PE二進(jìn)制文件進(jìn)行最初的分析時(shí)需要查看它,因?yàn)樗赋隽顺绦蛩{(diào)用的庫,這些調(diào)用反過來又可能會(huì)泄露惡意軟件的高級(jí)功能。
.rsrc節(jié)
.rsrc節(jié)包含了程序用于將文本呈現(xiàn)為字符串的可打印字符串。
.reloc節(jié)
PE二進(jìn)制文件的代碼并非是與位置獨(dú)立的,這意味著如果將它從預(yù)期的內(nèi)存位置移動(dòng)到新的內(nèi)存位置,它將無法正確執(zhí)行。.reloc節(jié)在不破壞代碼的情況下通過允許移動(dòng)代碼來解決這個(gè)問題。
3、使用pefile解析PE文件格式
代碼如下:
import pefile#實(shí)例化pefile.PE,通過調(diào)用PE構(gòu)造函數(shù),加載并解析指定的PE文件 pe = pefile.PE("ircbot.exe")#遍歷PE文件的各個(gè)節(jié)點(diǎn)并打印有關(guān)它們的信息 for section in pe.sections:print (section.Name, hex(section.VirtualAddress), hex(section.Misc_VirtualSize), section.SizeOfRawData)''' 輸出b'.text\x00\x00\x00' 0x1000(加載節(jié)的虛擬內(nèi)存地址基址,也可以視為節(jié)的內(nèi)存地址基址) 0x32830(指定了節(jié)被加載后所需的內(nèi)存大小) 207360(該節(jié)將在該內(nèi)存塊中所占用的數(shù)據(jù)量) 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列出二進(jìn)制文件將加載的DLL文件, 以及它將在這些DLL文件中所請(qǐng)求的函數(shù)調(diào)用。#從ircbot.exe中提取導(dǎo)入信息 for entry in pe.DIRECTORY_ENTRY_IMPORT:print (entry.dll)for function in entry.imports:print ('\t', function.name)#輸出 列出了惡意軟件聲明和將引用的豐富的函數(shù)數(shù)組 ''' 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.讀入數(shù)據(jù)<font color=#999AAA >代碼如下(示例):```c data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())4、獲取惡意軟件的圖像
??要了解惡意軟件如何設(shè)計(jì)來捉弄攻擊目標(biāo),就可以查看它的.rsrc節(jié)中所包含的圖標(biāo)。使用wrestool(0.32.3)從fakepdfmalware.exe中提取圖像資源保存為.icon格式,并使用icotool轉(zhuǎn)換為png圖像。
5、獲取惡意軟件的字符串
??字符串是程序二進(jìn)制文件中可打印字符的序列。這些字符串通常包含下載網(wǎng)頁和文件的HTTP和FTP命令,用來告訴你惡意軟件連接到的地址的IP地址和主機(jī)名等類似信息。有時(shí),即使用來編寫字符串的語言也有可能暗示惡意軟件二進(jìn)制文件的來源國,盡管可能是偽造的。甚至可以在一個(gè)字符串中找到一些文本,它們用網(wǎng)絡(luò)用語解析了惡意二進(jìn)制文件的用途。
??字符串還可以顯示有關(guān)二進(jìn)制文件的更多技術(shù)信息。例如,創(chuàng)建二進(jìn)制文件的編譯器、編寫二進(jìn)制文件所使用的編程語言、嵌入式腳本或HTML等信息。雖然惡意軟件作者可以對(duì)所有這些痕跡進(jìn)行混淆、加密和壓縮等處理,但是即便是高水平的惡意軟件作者也經(jīng)常會(huì)暴露并留下一些痕跡。
將ircbot.exe中的字符串鏡像到ircbotstring.txt文件中。
6、反匯編技術(shù)
??反匯編是將惡意軟件的二進(jìn)制代碼轉(zhuǎn)換為有效的x86匯編語言的過程。惡意軟件作者通常使用C/C++等高級(jí)語言編寫惡意軟件程序,然后使用編譯器將源代碼進(jìn)行編譯成x86二進(jìn)制代碼。但是,反匯編并非易事,因?yàn)閻阂廛浖髡呓?jīng)常使用一些技巧來阻撓逆向工程。由于目前要達(dá)到完美的反匯編是不可能的,我們必須使用不完善的方法來完成這項(xiàng)任務(wù),使用的方法是線性反匯編,這涉及到PE文件中識(shí)別哪些與其x86程序代碼相對(duì)應(yīng)的連續(xù)字節(jié)序列,然后解碼這些字節(jié)。這種方法主要的局限性是它忽略了CPU在程序執(zhí)行過程中如何解碼指令的細(xì)微差別。此外,它也無法解析惡意軟件作者有時(shí)使用的使程序更難分析的各種混淆。
6.1、使用pefile和capstone反匯編ircbot.exe
使用開源python庫pefile和capstone,這是一個(gè)可以反匯編32位x86二進(jìn)制代碼的開源反匯編庫。反匯編ircbot.exe匯編代碼的前100個(gè)字節(jié)。
#!usr/bin/python3 #-*- coding:utf-8 -*- import pefile from capstone import *#反匯編ircbot.exe#加載目標(biāo)PE文件 pe = pefile.PE("ircbot.exe")#從程序頭中獲取程序入口點(diǎn)的地址 entrypoint = pe.OPTIONAL_HEADER.AddressOfEntryPoint#計(jì)算入口代碼被加載到內(nèi)存中的內(nèi)存地址 entrypoint_address = entrypoint + pe.OPTIONAL_HEADER.ImageBase#從PE文件對(duì)象獲取二進(jìn)制代碼 binary_code = pe.get_memory_mapped_image()[entrypoint:entrypoint+100]#初始化反匯編程序以反匯編32位x86二進(jìn)制代碼 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))#結(jié)果 ''' 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、限制靜態(tài)分析的因素
加殼、資源混淆、反匯編技術(shù)、動(dòng)態(tài)下載數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的第一章:恶意软件静态分析基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux设备驱动入门----globa
- 下一篇: 第27周六