先靜態分析
最下面這些internet開頭的函數都是wininet的一部分,這個庫提供了通過網絡使用http的一組簡單的api
internetopena:用於初始化對wininet庫的使用,並設置用於http通信的user-agent字段
internetopenurla:使用一個完整的ftp 或http的url,來打開一個句柄
internetreadfile用於從internetopenurla打開的句柄中讀取數據
internetclosehandle用於關閉已經文件的句柄
這一部分和lab6-1類似,就是一些聯網的操作
接下來嘗試使用wireshark監聽流量
wireshark開啓監聽後,打開文件,如下圖所示
可以看到dns請求查詢惡意網址
我這臺winxp上的是ie6
但是在抓到的流浪中看到,使用get請求惡意網址時,該文件該僞造了user-agent
接下來載入ida分析
main函數一個次調用是sub_40100
跟入
與我們之前分析的lab6-1.exe是一樣的,不再分析了
根據問題2,看sub_40117f,
在其附近可以看到有兩個push壓棧操作
跟入後可以看到
確實是傳入兩個參數
一個是格式化字符串success。。。。
另一個是ecx,往上看
是401148的調用返回字符
因爲字符串後面有%c,所以可知這是格式化字符串,因此我們推斷40117f調用了printf,可以給它重命名
光標定位到40117f,按n
修改如上,點擊ok即可
printf會把success處的%c替換成另一個壓入棧的參數
main函數調用的第二個子過程爲sub_401040
跟入後可以看到
裏面都是我們靜態分析時發現的wininet api的調用。
具體來看
首先是Internetopen,用於初始化對wininet庫的使用
注意這裏壓棧了之前在wireshark中看到的那個user-agent
然後是internetopenurl,來打開位於壓入棧參數的靜態網頁,也就是www.practice……
可以看到internetopenurla的返回結果賦給了hfile
並通過cmp指令與0比較,如果不等於0則跳到loc_40109d,也就是走左邊的分支,hfile就這樣傳給了internetreadfile。可以看到,這裏的hfile就是一個用於訪問url的句柄
internetreadfile用於從internetopenurla打開的網頁中讀取內容
從文檔中知道:https://docs.microsoft.com/en-us/windows/win32/api/wininet/nf-wininet-internetreadfile
對照着ida的返彙編結果,我們知道第二個參數爲接收數據的buffer,而在ida中也將其標記爲buffer
由Push 200h可知,會讀取0x200字節的內容,也就是buffer爲0x200大小,即10進制的512
既然ida沒有識別出來,我們可以自己設置
在任意處ctrl+k
在buffer這邊右鍵->數組
設置爲512
點擊ok即可
cmp用於比較返回值是否爲0
如果爲0,則關閉句柄並終止
如果不爲0,則跳到loc_4010e5
如上圖所示,可知,代碼會將buffer每次逐一與一個字符比較,每次比較時buffer數組的索引值加1
最開始是cmp ecx,3ch
檢查第一個字符是否等於0x3c
在0x3c處右鍵可以將其改爲<
對於後面的也是同理
可以看到就是比較buffer前4字節是否爲<!—
這串字符是html的註釋開始部分
如果其中有一處比較不成功,則會跳到loc_40111d
全成功則會執行mov al,[ebp+buffer+4],作用是buffer第5個字符會移到al中,並從這個函數返回
回到main函數
如果401040返回非零值,則jnz跳到loc_40115c,打印success,,字符串中的%c會被處理爲函數讀取的buffer的第五個字符
後面是調用sleep
參數爲0ea60h,即10進制的60000ms
那麼程序爲什麼會這麼寫呢?
我們來理一下。程序首先檢查是否有一個可用的internet連接,然後下載一個包含了<!—的網頁,由於這是html註釋的開頭部分,在瀏覽器中不會被顯示,但是惡意軟件可以讀取到命令,但是在正常人觀察來看,惡意代碼只是在訪問一個網頁,而不是在接收攻擊者發給它的指令。