惡意程式碼分析實戰 Lab 9-2 習題筆記,lab9-2

來源:互聯網
上載者:User

惡意程式碼分析實戰 Lab 9-2 習題筆記,lab9-2
Lab 9-2問題1.在二進位檔案中,你看到的靜態字串是什嗎?

解答: 我們先查看一下靜態字串的在IDA中,這裡用IDA來查看比較方便點

這裡顯示了在二進位檔案中的靜態字串

2.當你運行這個二進位檔案時,會發生什麼?

解答: 運行我就不運行了,書上說了運行之後立刻就退出了,所以還要重設虛擬機器,懶得做了,運行會發生的就是立刻退出了這個函數

下面開始二進位分析

這裡我用的是吾愛破解版的OD,這個比較好使(可以很好的顯示中文),唯一缺點就是無法調字型

函數從開始運行,到這裡會調用第一個不是系統函數的函數,叫00401F08,我們可以進去看看是什麼

這個函數沒有什麼分析的價值,是函數的堆初始化函數

然後下一個不是系統調用的函數是這個

一個叫00401D5D的函數

然後進來之後的第一個調用是這個

一個叫004023C0的函數,我們進去看看

這裡我們注意到這個函數有個GetStartupInfoA,這個MSDN中是這樣說的

檢索調用進程建立時指定的STARTUPINFO結構的內容

這個也是初始化函數,還沒有到main函數

然後下一個函數

緊接的就是下一個函數

這裡調用了GetCommandLineA這個函數

這個函數是獲得使用者輸入的命令參數的

我們可以看到這個函數調用完之後

EAX的值馬上就變成了我們目前的目錄的,也就是argv[0]的值

然後下一個函數是

這個叫004019DE的函數

函數進來的第一個調用是GetEnvironmentStringsW

MSDN中,我們可以看到傳回值

Return value
If the function succeeds, the return value is a pointer to the environment block of the current process.

If the function fails, the return value is NULL.

然後我們能運行OD查看這個函數的執行結果

這個EAX的值是個指標,我們去查看這個地址上的值

這裡就是我們運行這個檔案所在的PATH

然後下面就是下一個調用,這次調用的是GetEnvironmentStrings,這個和上面那個函數差不多,我們看看傳回值,不過這裡被jmp跳轉了,這個函數不會被執行

然後就會一直在這裡做迴圈,這個迴圈是一次比較每個字元的操作

然後這裡一直運行下去就會結束了

然後我們按照書上的做法,在main函數的開始(0x401128)放一個斷點,然後運行

然後這樣我們就進來了main函數

函數的第一個調用是GetModuleFileNamed這個,我們看看傳回值

注意看入參

這時候的入參PathBuffer已經變成12FC80了,我們跳到那個記憶體位址上

這裡還是0,然後我們運行調用

這個地址馬上變了,然後我們查看值,就是我們這個檔案所在的目錄

然後下一個調用

這裡我們在IDA中找找對應,防止走丟

這個函數在IDA中已經標識出來,是_strrchr,這個函數是個C++的函數,用來尋找字元的

我們注意到上面push了兩個參數入棧

最後一個push入棧的是ecx,然後看看值

ECX在這裡的值是這個可執行檔的絕對路徑,也就是要源字串,然後我們的要尋找的字元是5Ch這個東西也就是\這個字元

然後這個函數的傳回值就是指向最後一個\字元的位置,我們運行看看

和我們預想的一樣,這個函數返回了最後一個\字元的位置

然後繼續下一個調用

IDA中對應的是

這是一個字串比較的函數_strcmp

這裡兩個入參是ecxeax,我們看看這兩個值是多少

這個字串就是書中那個被混淆的字串

然後另一個字串的話,我們回到上面建立字串那裡,然後運行到這些賦值完成

我們知道0x0在二進位的世界就是代表字串結束的那個\0字元,所以我們在ebp上尋找這兩個字元

此時的ebp這裡寫代碼片

然後我們右鍵在記憶體中找到這個地址

第一個字串的地址是

也就是12FF80-1B0=12FDD0

這裡你也可以看見下一個字串是ocl.exe

如果我們用這種方法去找下一個0x0隔開的第二個字串的話

這個值就是ebp-0x1A0也就是

12FF80-1A0=12FDE0

也就是剛剛那個下面的位置

然後繼續分析剛剛函數

這裡將兩個字元進行比較

程式預期的程式名字應該是ocl.exe這個字元

然後調用完之後用test判斷一下傳回值

如果傳回值是0的話,就一個je跳轉,否則就結束函數

然後下面mov edx, 0x1,將edx賦值為1

然後測試一下,這裡註定是不會跳轉的

然後繼續調用WSAStartup函數,這是調用winsock dll之前的初始化步驟

我們看看12FDE8存了什麼

什麼也沒有

調用完函數之後就變成這樣了

然後函數下一步準備進行這個操作

初始化了一個TCPsocket

這些操作都做完之後,就會準備調用這個函數了

我們在IDA裡面看看

這個函數在IDA裡面並沒有很好的顯示出來,估計不是一個常用的C函數

然後我們進入這個函數分析看看

函數之前的一個入參是這個

此時eax的值是

我們也是進入這個函數看看

這個函數最後會返回一個0Ch如果你用的是這個字串的話

在函數將要返回的最後,這個字串通過各種變換之後,將網站變了出來

所以這個函數的作用應該就是個網址的

然後下面的函數準備開始串連這個網址

這裡函數串連失敗,因為這個網址不存在,所以這裡會結束串連,並做一些清理工作

然後注意這裡會sleep一個30000ms的時間

我們這裡重新執行這個代碼,然後在判斷那裡不要跳轉關閉串連

這裡我們就用上我們的DNS fakeInetsim,這裡將機器的DNS設定我們DNS fake的ip,然後DNS fake就會將這個代碼請求的網域名稱返回成我們的inetsim的地址,然後下面就是這個惡意代碼去串連這個inetsim

這裡我們設定DNS fake了之後,這裡的gethostbyname()就返回正確了

紅線顯示我們就會跳過closesocket這個函數

然後我們下一個函數

這個函數是ntohs,這是個網路初始化函數

ntohs函數將u_short從TCP / IP網路位元組順序轉換為主機位元組順序(這在英特爾處理器上是小端的)

然後下一個函數不出所料就是connect

然後我們串連成功之後,就會遇到下一個函數

然後我們進去看看

然後我們進入發現了一個函數的調用,但是OD並沒有標註這個函數,我們第一感覺是要看看這個是不是系統函數調用,然後我們用IDA來開啟看看

這個函數在IDA裡面標註是_memset這個函數

這是函數的初始化函數,不用管

然後又遇到個函數,我們也是看IDA

IDA0040102C這個地方(也就是上面那個函數的下面),是這個函數

這個也是初始化函數,我們不理他

然後下面一個函數就開始建立一個進程了

ODLastError我們可以看到,這個建立進程的函數建立進程成功了

然後下一個函數就是這個

WaitForSingleObject 函數用來檢測 hHandle 事件的訊號狀態,當函數的執行時間超過 dwMilliseconds 就返回,但如果參數 dwMilliseconds 為 INFINITE 時函數將直到相應時間事件變成有訊號狀態才返回,否則就一直等待下去,直到 WaitForSingleObject 有返回直才執行後面的代碼

所以這裡會一直等待相應的時間,這個事件是hObject=7C81D63B這個東西

然後這個函數做完這些就會返回了

然後這個函數就可以命名為這個

CreateProcessAndWaitSignal,當然,這是我的個人命名方式,這個函數會建立一個進程來處理和伺服器的串連,然後主進程繼續執行

這裡有個技巧,就是直接將sleepnop填充了,省的它執行浪費時間

然後這裡函數又會跳回到原來初始化socket那個地方

這裡我們剛剛分析少了一個地方就是ntohs這個函數的的入參,這裡的入參是

從這裡可以看出來,這個是個定值,0x270Fh=9999d

所以這裡它會去串連惡意網域名稱的9999連接埠

然後我們這裡是第二遍執行,這裡connect的傳回值是-1d,因為我們的inetsim並沒有開9999連接埠

然後這裡就這樣一直迴圈串連,書中的提示是在這裡會有一個反向shell的建立

也就是_memset這個地方

這裡這個地方的,這裡已隱形模式建立了一個cmd.exe的視窗

這裡是哪裡指示這是個隱藏的視窗,這裡隱藏視窗並不是在這裡建立

是這裡,這裡設定了wShowWindow這個選項為SW_HIDE

然後在這裡

設定了hStdInputhStdErrorhStdOutput三個值都為一個通訊端,也就是我們剛剛串連那個通訊端

所以到這裡,這個代碼基本分析完畢了,這個代碼沒前一個那麼複雜和龐大

3.怎樣讓這個惡意代碼的攻擊載荷(payload)獲得運行

解答: 將這個代碼的名字改為ocl.exe

4.在地址0x00401133處發生了什嗎?

解答: 在地址那裡是將一個一個字元賦值的過程

這裡的0代表了字串結束符\0

5.傳遞給子列程(函數)0x401089的參數是什嗎?

解答: 這個函數的參數在OD中可以很清晰的看出來

就是那個加密的字串

6.惡意代碼使用的網域名稱是什嗎?

解答: 這個惡意網域名稱其實就是上一個問題的傳回值

也就是那個作者的網域名稱哈哈哈

7.惡意代碼使用什麼編碼函數來混淆網域名稱?

解答: 這個可以試著分析分析看,書上說是異或加密的,我們試著分析看看

函數在開始的時候,第一個調用的函數是_strlen這個

這個_strlen會計算輸入的字元的長度

然後函數的傳回值是0xCh也就是12d

然後函數就會做下面這些操作

這裡的esp是儲存著加密字串的地址

這個地址我們找一下

add esp, 0x4這個操作之前,esp的值是0012FB54這個,加了0x4之後就是0012FB58

然後就會指向stack裡面的下一個值

這個地址上的棧儲存著0012FD8E這個值

然後下面的local.65的值是ebp-0x104ebp0012FC64,最後結果的地址就是0012FB60

然後這個地址的值就變成了C

然後下一個變數是local.66的地址是是ebp-0x108,也就是0012FB5C

這裡給這個變數賦值為0

然後就是一個無條件跳轉JMP,然後跳轉到了下面這裡

這裡我們剛剛上面才賦值local.660,然後調用cmp指令,注意這個0x20是惡意代碼作者寫進去的,不是根據strlen計算得到的

然後這個跳轉有點變態,跳轉條件是SF=OF

這裡的SF是符合標誌位,如果結果為負數則其值為1,如果為正數,則為0

然後OF是溢出標誌位,溢出的話,值則為1,否則為0cmp函數的其實是減運算,只是值不儲存

我們這裡的local.66=0,減去0x20之後,值為負數,SF=1,值沒有溢出,OF=0,所以SF<>OF,這裡不會跳轉

然後將入參arg.2的值賦值給了edx,我們看看這個入參是多少

然後這裡我們看看記憶體和棧中的值

棧中的指示像是個指標,但是這個指標地址比較大,感覺不太可能有這麼大的指標,在記憶體中一跳,就會發現這個記憶體位址不存在

下一步是一個add操作

這裡將local.66的值和edx相加,edx值不變

下一步就是一個movsx指令,將值帶符號擴充之後賦值給ecx

原來的值部署54160646h嘛,movsx只看後八位也就是46=01000110,第一個字元是0,所以這個擴充之後就是00000046h

然後一個moveax的值賦值成為0


現在ecx的值已經變成46h

下一個指令是cdq,這是將eax擴充成為edx:eax的方法,沒做這個操作之前的eax0x0hedx0012FD90,做了這個操作之後,連同edx都被賦值成了0

idiv當除數是 32 位的時候,(現在就是),然後local.65還是等於0xCh

然後這裡的除數是local.65,被除數是edx:eax,也就是edx:eax/local.65這個意思

結果的商儲存在eax裡面,然後餘數儲存在edx裡面,注意這裡是帶符號的除法

OD裡面做完這個指令之後,EAXEDX並沒有變化

這裡將加密字串賦值給eax,然後帶符號擴充edx

最終的edx變成了0x31h

然後是這樣的

然後將這個值傳遞給這裡之後就跳轉了

8.惡意代碼在0x0040106E處調用CreateProcessA函數的意義是什嗎? 著作權聲明:本文為博主辛辛苦苦碼字原創文章,轉載記得表明出處哦~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.