iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
Security

《Nyahello!從零開始的 30 天 malware 學習日誌》系列 第 10

【Day 10】探索 IDA!使用方法與交叉參照介紹

  • 分享至 

  • xImage
  •  

前言

現在我們已經對 IDA 的介面有了基本的認識,今天我們就要來實際使用 IDA Pro 分析惡意程式!

使用導覽

IDA Pro 中的許多視窗都與反組譯視窗互相連結,因此在瀏覽的時候可以互相跳來跳去,例如,在 Imports Window 或 Strings Window 中對某個項目點兩下,IDA Pro 就會直接帶你前往該項目所在的位置。

使用連結和 Cross-References

另一種在 IDA Pro 中進行導覽的方法,是使用反組譯視窗裡面的連結,例如下圖顯示的這些連結。

https://ithelp.ithome.com.tw/upload/images/20260905/20183878Q0Fb87ByjH.png

對其中任何一個連結 ❶ 點兩下,都會讓 IDA Pro 在反組譯視窗中顯示該連結所指向的目標位置。以下是幾種常見的連結類型:

  • Sub Links 是指向函式起始位置的連結,例如 printfsub_4010A0
  • Loc Links 是指向 jump destinations 的連結,例如 loc_40107Eloc_401097
  • Offset Links 是指向記憶體中某個偏移位置的連結。

Cross-references(交叉參照,Xrefs,在程式碼列表的 ❷ 處顯示)可以讓你快速將目前顯示的位置跳轉到「引用該項目的程式碼位置」。在這個例子中,引用的位置是 0x401075

瀏覽歷史

https://ithelp.ithome.com.tw/upload/images/20260905/20183878aWBJOYlBJN.png

在 IDA Pro 裡面可以像瀏覽網頁一樣往回看或往後看,每次瀏覽到新的地方就會加入歷史。

搜尋

假設我們今天拿到一支程式,跑起來以後看到想要查詢的關鍵字,就可以利用搜尋功能去找到他的位置

https://ithelp.ithome.com.tw/upload/images/20260905/20183878rVJIc2Bn9Z.png

以上圖為例,我們看到了程式的回應 Bad key,所以就可以拿來搜尋看看能不能找到能成功的輸入

https://ithelp.ithome.com.tw/upload/images/20260905/20183878M8zKYSCxrQ.png

接著注意到 Bad key 在位址 0x401104 ❶ 被使用,因此我們在搜尋視窗中點兩下,他會直接跳到反組譯視窗中的這個位置。

https://ithelp.ithome.com.tw/upload/images/20260905/20183878MYZDJE1xaZ.png

查看這段程式碼後,我們發現在 "Bad key\n" 之前,位址 0x4010F1 有一個比較操作,它會檢查 strcmp 的執行結果,而傳入 strcmp 的其中一個參數是字串 $mab,所以字串很可能就是密碼。

https://ithelp.ithome.com.tw/upload/images/20260905/20183878w6i2L0XH3E.png

重新執行後輸入 $mab 就可以發現成功觸發結果。

交叉參照

Cross-reference(交叉參照)在 IDA Pro 中通常稱為 xref,它可以告訴我們某個函式是在哪些地方被呼叫的,或某個字串是在哪些地方被使用的。如果我們找到了一個值得注意的函式,並且想知道這個函式被呼叫時傳入了哪些參數,就可以利用 Cross-reference 快速跳到呼叫該函式的位置,查看那些參數被放入 Stack 的地方。DA Pro 也可以根據 Cross-references 產生一些很有用的圖形以協助進行程式分析。

程式碼交叉參照(Code Cross-reference)

https://ithelp.ithome.com.tw/upload/images/20260905/20183878YjyRF5ieAE.png

https://ithelp.ithome.com.tw/upload/images/20260905/20183878QdrXi1lz7z.png

上圖 在 ❶ 的位置顯示了一個 Code Cross-reference,它顯示了這個函式 sub_401000 是從 main 函式內部被呼叫的,而且呼叫位置位於 main 函式起始位置之後偏移 0x3 的地方。

❷ 處的 Jump 所對應的 Code Cross-reference,則告訴我們是哪一個 Jump 會跳到目前這個位置。在這個例子中,它所對應的就是 ❸ 所標示的位置。我們之所以知道這一點,是因為在 sub_401000 函式起始位置之後偏移 0x19 的地方,有一條位於記憶體位址 0x401019jmp 指令。

在預設情況下,即使一個函式實際上可能在很多地方被呼叫,IDA Pro 對於任何一個指定的函式通常只會顯示其中幾個 Cross-references。如果想查看某個函式的所有 Cross-references,可以點選該函式名稱,然後按下鍵盤上的 X。接著彈出的視窗會列出所有呼叫這個函式的位置。

https://ithelp.ithome.com.tw/upload/images/20260905/20183878EJ2IZ5MZzU.png

在上圖底部,可以看到 sub_408980 的 Cross-references 列表。從畫面上的「Line 1 of 64」可以知道,這個函式總共被呼叫了 64 次。在 Xrefs Window 中隊任何一個項目點兩下,就可以直接前往反組譯視窗中對應的 Reference 位置。

資料交叉參照(Data Cross-reference)

資料交叉參照是用來追蹤資料在二進位檔案中是如何被存取的,只要某個資料位元組在程式碼中透過記憶體參照被使用,就可以和 Data Reference 建立關聯,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20260905/20183878zZCV8WtGMK.png

如上圖,我們可以在 ❶ 的位置看到一個指向 DWORD 0x7F000001 的 Data Cross-reference。對應的 Cross-reference 告訴我們,這筆資料是在位於 0x401020 的函式中被使用。

下一行則顯示了一個針對字串 <Hostname> <Port> 的 Data Cross-reference,如果我們在分析的時候看到一個有趣的字串,可以使用 IDA Pro 的 Cross-reference 功能,查看這個字串在程式碼中的確切使用位置,以及它究竟是如何被使用的。

lab 5-1

因為篇幅的關係今天先做比較基本的分析!使用教材提供的 Lan05-01.dll 檔案載入後拿來分析。

Questions

1. DllMain 的位址

https://ithelp.ithome.com.tw/upload/images/20260905/20183878iYdM0jEPOD.png

題目要求我們找到 DllMain 的位址,所以我們首先在 Functions 視窗找到它

https://ithelp.ithome.com.tw/upload/images/20260905/20183878o3rdsgGI1F.png

接著按照昨天的教學 按空白鍵切換到文字視窗就可以看到 DllMain 的位址是 0x1000D02E

2. 使用 Imports 視窗找到 gethostbyname 的位址

在 Imports 視窗中使用搜尋功能就可以找到 gethostbyname

https://ithelp.ithome.com.tw/upload/images/20260905/20183878nuGHyDgUHy.png

接著對他點兩下就可以看到他在 .idata 段落的 0x100163CC

https://ithelp.ithome.com.tw/upload/images/20260905/20183878UCcJ86wWnF.png

3. 有多少函式呼叫了 gethostbyname

gethostbyname 的地方按 X 就可以看到他被誰呼叫

https://ithelp.ithome.com.tw/upload/images/20260905/20183878j8JaqqIFYX.png

在上圖中可以看到他寫 18 次,不過相同位址會有 r 跟 p 的類型所以其實是同一個呼叫,總共是 9 次,然後被 5 個不同的函式呼叫。

4. 看 0x10001757gethostbyname 的呼叫找出會發生的 DNS 請求

首先對 0x10001757 的那個呼叫點兩下

https://ithelp.ithome.com.tw/upload/images/20260905/201838788IriKCnfWD.png

接著把尋找和 DNS 有關的資訊

https://ithelp.ithome.com.tw/upload/images/20260905/20183878RuMCbjdXaV.png

首先找到 gethostbyname 的位置

.text:10001757 call ds:gethostbyname

因為他的功能就是把 hostname 解析成 IP 位址,所以看到它,就知道這裡會進行名稱解析,通常會導致 DNS 查詢。接著看 gethostbyname 的參數

.text:10001756 push eax ; name

因此 eax 此時指向的字串,就是要解析的 hostname,接著再往上看到

.text:1000174E mov eax, off_10019040 ; "[This is RD0]pics.practicalmalwareanalys"...

因此可以還原成

gethostbyname("pics.practicalmalwareanalys...");

然後再對他點兩下就可以看到完整的 DNS 請求是對 pics.practicalmalwareanalys.com

結語

今天對於如何使用 IDA Pro 分析惡意程式又有進一步的認識,本日介紹了使用的方式與交叉參照,並且利用 Lab 5-1 來做示範,明天會再繼續介紹 IDA 對於函式分析的方法以及如何使用圖形功能來看等等,並且繼續使用 Lab 5-1 做示範!

參考資料

  • Practical Malware Analysis (Chapter 5)

本日貓味

https://ithelp.ithome.com.tw/upload/images/20260905/20183878evK3H0HcWL.jpg


上一篇
【Day 9】認識 IDA!malware 靜態分析的強大工具
下一篇
【Day 11】實戰 IDA!使用函式分析與圖形閱讀 malware 資訊
系列文
《Nyahello!從零開始的 30 天 malware 學習日誌》17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言