20192415 2021-2022-2 《網路與系統攻防技術》實驗四實驗報告
20192415 2021-2022-2 《網路與系統攻防技術》實驗四實驗報告
1.實驗內容
1.1 實驗內容
- 惡意程式碼檔案型別標識、脫殼與字串提取:對提供的rada惡意程式碼樣本,進行檔案型別識別,脫殼與字串提取,以獲得rada惡意程式碼的編寫作者。
- 使用IDA Pro靜態或動態分析crackme1.exe與crakeme2.exe,尋找特定輸入,使其能夠輸出成功資訊。
- 分析一個自制惡意程式碼樣本rada,並撰寫報告,回答問題。
- Windows 2000系統被攻破並加入殭屍網路的取證分析實踐:資料來源是Snort收集的蜜罐主機5天的網路資料來源,並去除了一些不相關的流量,同時IP地址和其他敏感資訊被混淆。
2.實驗過程
2.1 惡意程式碼檔案型別標識、脫殼與字串提取
2.1.1 使用檔案格式和型別識別工具,給出rada惡意程式碼樣本的檔案格式、執行平臺和加殼工具
-
使用file命令檢視檔案格式,結果如下。
file命令用來識別檔案型別,也可用來辨別一些檔案的編碼格式。它是通過檢視檔案的頭部資訊來獲取檔案型別,而不是像Windows通過副檔名來確定檔案型別的。
“PE32”說明是一個32位的PE檔案,“(GUI) Intel 80386”說明執行在Intel 80386 GUI上,“MS Windows”說明針對的作業系統是Windows。
┌──(root㉿20192415xingzhibin)-[~/rada] └─# file RaDa.exe RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows
-
使用PE Explorer檢視檔案格式、執行平臺
除了在linux中使用file命令,在windows中可以藉助程式解析器等工具檢視檔案資訊,如PE Explorer。
PE Explorer是功能超強的視覺化Delphi、C++、VB程式解析器,能快速對32位可執行程式進行反編譯,並修改其中資源。
如下圖所示,這是使用PE Explorer檢視RaDa.exe的檔案頭資訊。
“Machine(處理器)”欄位是執行平臺,內容為0x014c,表明可執行在Intel386處理器或後續相容處理器;
“Magic(魔術)”欄位是檔案型別,內容為0x010B,表明這是一個32位的PE檔案。 -
使用PEID檢視加殼工具
當加殼的程式執行時,會首先執行一小段脫殼程式碼,來解壓縮加殼的檔案。我在分析的時候是利用PEid這款工具對程式檢查是否存在殼(PEid工具在2011年4月就停止更新了,但是還是可以識別大多數的殼)。
識別結果為“UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo”,可知該程式加的是UPX的殼,版本是0.89.6。
2.1.2 使用超級巡警脫殼機等脫殼軟體,對rada惡意程式碼樣本進行脫殼處理
使用超級巡警脫殼機進行脫殼,脫殼後程序為RaDa_unpacked.exe。
2.1.3 使用字串提取工具,對脫殼後的rada惡意程式碼樣本進行分析,從中發現rada惡意程式碼的編寫作者是誰
-
使用strings命令分析
使用strings命令分析脫殼後的rada惡意程式碼樣本(即RaDa_unpacked.exe),分析結果如下圖所示(左圖未脫殼,右圖已脫殼)。
strings命令: 在物件檔案或二進位制檔案中查詢可列印的字串。
-
用IDA Pro調整編碼格式
在RaDa_unpacked.exe的string中,發現有一行為“(c) Raul Siles & David Perez”,猜測與編寫作者相關。
用IDA Pro開啟RaDa_unpacked.exe,“View”→“Open subviews”→“strings”檢視字串。右鍵單擊選擇“setup”,更改allowed string types為Unicode,再次檢視,
出現“Copyright (C) 2004 Raul Siles & David Perez”。
“Copyright”有“版權、著作權”的意思,可知該惡意程式碼為Raul Siles和David Perez在2004年編寫。
2.2 使用IDA Pro靜態或動態分析crackme1.exe與crakeme2.exe,尋找特定輸入,使其能夠輸出成功資訊
2.2.1 在linux中安裝IDA Pro6.4
IDA是比利時Hex-Rays公司出品的一款互動式靜態反彙編工具。它可以直接反彙編出二進位制檔案的彙編程式碼,是目前軟體逆向與安全分析領域最好用、最強大的一個靜態反彙編軟體,已成為眾多軟體安全分析人員不可缺少的利器!它支援Windows、Linux等多個平臺,支援Intel X84、X64、ARM、MIPS等數十種CPU指令集。
Linux版本的IDA Pro比較稀少,很幸運的是吾愛破解論壇已經有大牛分享了Linux版本的IDA Pro,分享的作者已經對該IDA Pro進行了path,去掉了區域網檢測的校驗。下載該Linux版本IDA Pro直接解壓,在Linux 32bit系統上可以直接使用,在Linux 64bit的系統上需要安裝一些依賴庫檔案能正常使用該IDA Pro。
具體在kali中安裝IDA Pro可參考ida pro6.4 linux安裝使用。
2.2.2 分析crackme1.exe
-
使用file命令檢視crackme1.exe的檔案資訊
可知crackme1.exe為windows系統下執行的32位可執行程式,沒有圖形介面,僅使用控制檯操作。
┌──(root㉿20192415xingzhibin)-[~/exp4] └─# file crackme1.exe crackme1.exe: PE32 executable (console) Intel 80386, for MS Windows
-
執行程式並試探輸入格式
希望通過特定輸入使crackme1.exe輸出成功資訊,首先要確定“特定輸入”可能包含幾個引數。
多次執行crackme1.exe並嘗試不同的引數個數,通過返回結果判斷正確的引數個數(不含程式名)可能是一個。 -
利用IDA檢視crackme1.exe包含哪些字串
程式中往往包含很多字串資源,這些資源存在於PE檔案的rdata段,使用IDA反編譯後,可以查詢到這些字串。
選擇“View”→“Open subviews”→“strings”,檢視字串。
可知共有4種字串,目前我們試探出其中兩種為返回情況:“I think you are missing something.”是“引數數量不對”時的返回情況、“Pardon? What did you say?”是“引數數量對但內容不對”的返回情況。 -
利用IDA檢視crackme1.exe的函式呼叫圖
選擇“View”→“Graphs”→“Function calls”,檢視函式呼叫圖。
可以看到,_main函式可以呼叫_fprintf和_printf。據此,我們判斷_main中包含選擇輸出哪些資訊的邏輯結構。fprintf是C/C++中的一個格式化庫函式,位於標頭檔案中,其作用是格式化輸出到一個流檔案中。
printf 是指格式化輸出函式,主要功能是向標準輸出裝置按規定格式輸出資訊。printf是C語言標準庫函式,定義於標頭檔案。 -
檢視函式與反彙編
通過“Jump”→“Jump to function”→“_main”檢視_main函式。按下F5(或“View”→“Open subviews”→“Generate pseudocode”)進行反彙編。
讀程式碼可知,程式首先會判斷引數個數,若引數個數不為2(包含函式名),輸出“I think you are missing something.”,否則進入下一層選擇結構。下一層判斷第二個引數是不是“I know the secret”,若是則輸出“You konw how to speak to programs,Mr.Reverse-Engineer”,否則輸出“Pardon? What did you say?”。
希望通過特定輸入使crackme1.exe輸出成功資訊,就需要將“I know the secret”作為第二個引數,這樣就可以得到成功資訊“You konw how to speak to programs,Mr.Reverse-Engineer”。效果如下。argc和argv這兩個C語言預訂的引數可以實現給main函式傳參:
argc是int型別,表示執行程式的時候給main函式傳遞了幾個引數
argv是一個字串陣列,這個陣列用來儲存argc個字串,每個字串就是我們給main函式傳的一個引數。第一個引數argv[0]一定是程式名稱。
2.2.3 分析crackme2.exe
對crackme2.exe的分析過程與crackme1.exe類似。
-
使用file命令檢視檔案資訊
crackme2.exe同樣為windows系統下執行的32位可執行程式、沒有圖形介面僅使用控制檯操作。
-
執行程式並試探輸入格式
通過返回結果判斷正確的引數個數(不含程式名)可能是一個。
-
利用IDA檢視crackme2.exe包含哪些字串
可知共有5種字串,目前我們試探出其中兩種為返回情況:“I think you are missing something”是“引數數量不對”時的返回情況、“Pardon? What did you say?”是“引數數量對但內容不對”的返回情況。
-
利用IDA檢視函式呼叫圖
可以看到,_main函式可以呼叫_fprintf、puts、putchar。據此判斷_main中包含選擇輸出哪些資訊的邏輯結構。
puts()函式用來向標準輸出裝置(螢幕)輸出字串並換行。
putchar把指定的字元(一個無符號字元)寫入到標準輸出stdout中。 -
檢視函式與反彙編
檢視_main函式,按下F5(或“View”→“Open subviews”→“Generate pseudocode”)進行反彙編。
讀程式碼可知,程式首先會判斷引數個數,若引數個數不為2(包含函式名),輸出“I think you are missing something.”,否則進入下一層選擇結構。下一層判斷第一個引數是不是“crackmeplease.exe”,不是則輸出“I have an identity problem.”,否則進入下一層選擇結構。下一層判斷第二個引數是不是“I know the secret”,若是則輸出成功資訊,否則輸出“Pardon? What did you say?”。
希望通過特定輸入使crackme2.exe輸出成功資訊,就需要將“crackmeplease.exe”作為第一個引數,將“I know the secret”作為第二個引數,這樣就可以得到成功資訊。
要求第一個引數是“crackmeplease.exe”,而第一個引數是程式名,所以要先對crackme2.exe重新命名為“crackmeplease”後再執行。效果如下。