有一題問,手上有一個來路不明的執行檔,第一步應該做什麼。
我想說丟沙箱跑起來才知道這個執行檔會做什麼,反正沙箱有隔離。
那題正解是先做靜態分析。
靜態的意思很直白,檔案放著不動,只看它本體。
算一個 hash 拿去比對公開資料庫裡有沒有這個檔(hash 是把整個檔案算成一串固定長度的字,內容差一個 bit 就會完全不一樣)。把檔案裡看得到的字串整串撈出來,網址、檔案路徑、指令參數有時就直接躺在裡面。再看檔頭,它是什麼格式、什麼時候編譯的、引用了哪些系統功能。這些都不夠再反組譯,也就是把機器碼翻回組合語言來讀。
整個過程它一行都沒有跑起來。
執行就是引爆。沙箱是隔離,不讓正式環境受影響,不是完全零風險。
最簡單的靜態分析快速又便宜,hash算好丟給VirusTotal檢查,可以先得到一個初步的判斷。先做便宜又不會出事的,假設在這就已經發現這個執行檔已被大多數防毒判斷為惡意程式,可能就不必丟沙箱做測試了。假如測出來都沒有,也不能馬上斷定這個執行檔就安全,畢竟我們驗的hash是要百分百吻合,只要改一個bit,hash值就不一樣了,但還是能在目標上執行他的任務。
我當時腦子裡只有「它跑不出去」,就跳過了最簡單的一步。
但也不代表所有靜態分析都又快又便宜,相反的,閱讀程式碼甚至反組譯或反編譯,那可不是一天兩天可以做出來的。
沙箱是一個受控、而且看得見裡面發生什麼事的環境。它會記錄這支程式開了哪些檔、改了哪些登錄機碼、往哪裡連線,看完可以整個還原回乾淨的狀態。
所以有時會選擇把可疑的檔案丟進去,觀查他的行為,是一個既避免感染生產環境,又可以分析可疑檔案行為的方式。
如果是在一台主機上幾千個檔案都篩一遍,逐個撈字串、逐個反組譯根本做不完,這時候自動化沙箱可能會是比較好的做法。它不保證每一支都抓得到,但至少跑得完。
有的時候題目就直接說明了,分析師想看==這個binary跑起來會怎樣==
這時候就該沙箱出場了
所以不是拿到就先靜態分析,而是看目的是什麼。
有些檔案撈出來一片空白,或整片亂碼。
靜態到這裡就會卡住,因為可能沒辦法解譯,接下來才輪到動態,讓它在沙箱裡跑起來,看它跑起來是什麼樣子。
| 我拿到什麼 | 我的選擇 |
|---|---|
| 一個沒看過的執行檔,就這一個 | 先靜態,hash、字串、檔頭 |
| 字串撈出來空空的或全亂碼 | 可能被包過,準備進沙箱看行為 |
| 幾千個檔案要篩 | 自動化沙箱,一個一個讀做不完 |
| 想觀察程式行為 | 放進沙箱讓它動起來 |
不用找惡意程式,拿自己機器上正常的程式觀察就好。
Windows 上裝微軟自家 Sysinternals 的 Strings,Linux 直接用 strings,隨便挑一個安裝好的程式撈一次,你會看到一堆路徑跟錯誤訊息的原文。
算 hash 也是內建就有的:
certutil -hashfile C:\Windows\System32\notepad.exe SHA256
把算出來那串貼到 VirusTotal 的 SEARCH 欄位,它會告訴你這個檔案有沒有人交過、各家引擎怎麼判。但是查 hash 跟上傳檔案是兩件不同的事。
公司或客戶的檔案不要直接上傳到公開沙箱或 VirusTotal。檔案一上去就變成資料庫裡的數據。先hash再去查就不會有這個問題。