# 0x03. Static Analysis [TOC] <br> ## Intro 當你拿到一個未知檔案,你要做什麼? 點兩下??? 恭喜你你很可能會中毒.... 本節希望從不執行程式的角度,來看看有那些工具可以提供我們做分析 <br> ## File Type 實際上,要先弄明白他的檔案類別,他是PDF/Docx/EXE/zip....? 透過file指令可以輕鬆了解一個檔案的類別(mac/linux都支援) ``` kali@kali:~/Downloads$ file /usr/share/windows-resources/binaries/nc.exe /usr/share/windows-resources/binaries/nc.exe: PE32 executable (console) Intel 80386, for MS Windows ``` <br> ## Hashes Hash像是指紋的概念,每個檔案都有自己的指紋,會用某種密碼學,輸入檔案最後得到一個獨一無二的值:Hash value 常見有三種Hash function可以使用: MD5 / SHA1 / SHA256 ``` kali@kali:~/Downloads$ md5sum nc.exe e0fb946c00b140693e3cf5de258c22a1 nc.exe kali@kali:~/Downloads$ sha1sum nc.exe 57f0839433234285cc9df96198a6ca58248a4707 nc.exe kali@kali:~/Downloads$ sha256sum nc.exe be4211fe5c1a19ff393a2bcfa21dad8d0a687663263a63789552bda446d9421b nc.exe ``` 得到的Hash value可以拿去網路上搜索看看是否是已知的檔案,或是病毒 常見的搜尋引擎像是 [VirusTotal](https://www.virustotal.com/gui/home/upload) 註: 1. 儘管更改檔案中一個byte,hash value都會變得非常不一樣 2. hash是單向運算,無法從hash value回復原本檔案 3. hash已知有collision,但在本系列中暫不討論 <br> ## String 當針對檔案開始靜態分析,最簡單的方式就是看這個檔案有沒有一目瞭然的資訊,可以透過string來查看(環境為Kali Linux) ``` kali@kali:~/Downloads$ strings nc.exe !This program cannot be run in DOS mode. .text `.rdata @.data .idata D$,QSVh ... Cmd line: port numbers can be individual or ranges: m-n [inclusive] -u UDP mode -v verbose [use twice to be more verbose] -w secs timeout for connects and final net reads -z zero-I/O mode [used for scanning] -t answer TELNET negotiation -g gateway source-routing hop point[s], up to 8 -G num source-routing pointer: 4, 8, 12, ... -h this cruft -i secs delay interval for lines sent, ports scanned -l listen mode, for inbound connects ... CreateThread CreatePipe CreateProcessA DuplicateHandle GetCurrentProcess ExitThread ... ``` 儘管nc.exe(netcat)不是惡意程式,但我們還是可以透過strings來查看裡面的文字 像是nc.exe中的**Windows API**(CreateThread....),以及看起來像是help menu的文字,這都有助於未來更深入的分析 <br> ## IOC - Indication Of Compromise 在分析師分析完惡意程式後,會得到一些重要的特徵,能夠讓大家輕鬆的了解 **哪些指標可以讓我快速確定我的主機被感染了**,也是分析時最重要的一個產出 IOC同時也可以做為防火牆以及防毒軟體的重要依據 ``` Network IOC -- IP -- Domain name -- URL ... Host Based -- File Hashes/names/locations -- Registry ... ``` <br> ## PE Analysis - PE Studio 這個系列,會針對Windows執行檔來做介紹,前面介紹的PE包含的範圍相當有限,在這邊可以利用工具來了解更多資訊 [PE Studio](https://www.winitor.com/download) 是個非常好用的工具,可以看到PE檔案各種訊息,需要額外安裝 WannaCry MD5: db349b97c37d22f5ea1d1841e3c89eb4 --- ### Indicators 以WannaCry為例,可以看到PE Studio貼心的在indicators的地方提供一些分析  --- ### 程式編譯的時間 可以看到這個編譯時間明顯已經被改動過,2010明顯是錯誤的編譯時間  --- ### Imports 除了上述之外,也可以檢查imports(.idata section) 可以看到,有**Crypt**相關**Windows API**,說明這個檔案很可能具備加/解密的功能  --- ### Others Resources / strings也都是值得檢查的部分   --- 其他像是PE View/PE Bear也都提供了PE檔案檢視的功能,但重點是要透過工具來判斷是否有不尋常的地方 <br> ## Entropy 熵(Entropy),可以用來判斷程式隨機的程度 ????? 簡單說,就是指令複雜的程度,範圍 0-8 一般來說,常見的程式Entropy不會高於7,本次的Sample之中.text部分的Entropy並不高,代表可能是沒有用Packer打散過的  <br> ## Packer 加殼:惡意程式開發者,為了不讓自己的程式輕鬆的就被拿來分析,常常會利用加殼的方式增加分析者的難度 方法大致為:在PE檔案中寫入一個新的Section,該section負責把原本的程式還原成原本樣子並跳轉過去 最常見的就屬UPX,下面就是經過UPX加殼過的小算盤,.text section直接變成UPX0,UPX1  <br> 針對UPX要手動解殼也不難,可以直接用upx解殼,輕鬆愉快  <br> 但也不是所有的殼都這麼好解,可以利用 exeinfoPE / Detect It Easy來辨別  <br> ## IDA UI  https://www.hex-rays.com/ [IDA](https://www.hex-rays.com/): 是一款逆向工程最常用也功能相當齊全的工具,他不只可以分析Malware,更是逆向工程的好工具。IDA能幫助我們看到PE的組合語言,了解更多PE檔案內未知的細節 雖然好用,但是付費版有點貴,我普通人無法觸及的價格 :zany_face: 沒關係,我們當免費仔。FLARE VM已經幫我們裝好免費版的IDA,或是大神們也可以選擇 Ghidra ~~別問我,我都念Ghidra~~ Ghidra不僅是disassembler,更是裝有decompiler能從組合語言還原C的pseudo code --- ### Load file 這邊簡介一些IDA常用而且實用的功能吧,打開IDA Freeware > 選擇New > 選擇你要分析的檔案 這時IDA會自動幫你識別檔案類型,相當方便 通常都是選擇他預設的就可以了,本範例為 PE  <br> 進去後會看到以下畫面  可以看到IDA很貼心的分析出流程圖,幫助我們分析樣本 --- ### Functions 左側IDA列出了這個檔案所用的Functions,點兩下可以進入所選Function的流程圖  <br> ## IDA Usage ### space 按一下space,可以發現剛剛的流程圖變成一系列的組合語言,並附上每個指令的位址 再按一次可以回到剛剛的流程圖 此流程圖會出現的原因往往跟jump instruction有關係(可以參照第二章assembly的部分),根據instruction產生跳轉 --- ### Function Preview 滑鼠移到function上面,IDA會貼心地告訴你裡面的內容  --- ### back/forward position 如果不小心亂點,想回到上一頁,可以點圖中左箭頭。同理想回到最新的地方可以按右鍵頭  --- ### Strings 再一次的,利用IDA查看是否有可疑的String View > Open Subviews > Strings  --- ### Import/Export Table  --- ### Xref 在分析程式的時候,常常會好奇,這個function到底在哪裡被呼叫的? 這時候xref就派上用場了,點選你好奇的function,Ctrl + x 或按右鍵  可以看到這個function只被一個地方呼叫  --- ### 重新命名 在分析之後,如果你瞭解了這個function在做什麼,這時rename function會是很好的選擇 按右鍵或是輸入 n  --- ### Go to address/others g: 輸入位址,直接跳轉 H: 轉換成hex R: 轉換成String/char  <br> ## Exercise [nc.exe載點](https://app.any.run/tasks/58a7b2f3-0f01-4612-9fe0-84700cdbd472/#) 密碼: infected 嘗試利用 PE Studio/IDA,針對nc.exe做一遍上述的分析 熟悉工具使用之後,可以開始做真正的靜態分析了! <br> ## Static Analysis Tips 每個分析師都有自己一套方法做逆向分析,不一定誰的最好,但有些大方向概念可以推薦 1. 先從簡單的開始:string, API這種好下手的地方開始判斷 2. 不要太拘泥於每個Instruction,要判斷的是該function大方向在做的事 3. 對於編碼/加密等function可以透過動態分析來確認想法 4. 時間長了對 [Windows API](https://docs.microsoft.com/en-us/windows/win32/api/)會越來越熟悉,分析會越來越熟練 5. 歡迎補充... <br> ## Windows API Windows 提供了許多的API來幫助開發者寫軟體,當然這些API也可以為Malware所用 下列提供了一些常見的API,是值得在靜態分析/動態分析的時候特別留意的 [MSDN](https://docs.microsoft.com/en-us/windows/win32/api/) 是官方的資源,建議多使用 <br> **Networking:** socket ``` WSAStartup() socket() server: bind() listen() accept() client: connect() send() recv() WSACleanup() ``` WinINet(Application Layer) ``` InternetOpen() InternetOpenURL() InternetReadFile() ``` --- **檔案操作** ``` CopyFile() CreateFile() ; 開啟檔案 WriteFile() ReadFile() GetTempPath() ``` --- **Registry** ``` RegCreateKeyEx() RegOpenKeyEx() RegSetValueEx() RegDeleteKeyEx() RegGetValue() ``` --- **加解密** WinCrypt API: ``` CryptAcquireContext() CryptGenKey() CryptDestroyKey() CryptDeriveKey() CryptEncrypt() CryptDecrypt() CryptReleaseContext() ``` BCrypt API (newer) ``` BCryptOpenAlgorithmProvider() BCryptGetProperty() BCryptGenerateSymmetricKey() BCryptGenerateKeyPair() BCryptFinalizeKeyPair() BCryptEncrypt() BCryptDecrypt() BCryptDestroyKey() BCryptCloseAlgorithmProvider() BCryptImportKey() BCryptExportKey() ``` --- **Registry** ``` RegCreateKeyEx() RegOpenKeyEx() RegSetValueEx() RegDeleteKeyEx() RegGetValue() ``` --- **Memory操作** ``` VirtualAlloc() VirtualProtect() ReadProcessMemory() WriteProcessMemory() ``` <br> [-0xbc](https://hackmd.io/@0xbc000) ###### tags: `Malware Analysis` `Reverse Engineering` `tutorials`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up