Notification texts go here Contact Us Buy Now!

[Write-up] Practical Malware Analysis | Part 2 - Chapter 7 - Lab 7-2

Practical Malware Analysis

CHƯƠNG 7 - PHÂN TÍCH CÁC CHƯƠNG TRÌNH MÃ ĐỘC WINDOWS

Dowloads Lab tại đây

Xem lại tóm tắt nội dung của Chương 7 tại đây.

Table of Contents

Lab 7-2 Phân tích phần mềm độc hại được tìm thấy trong tệp Lab07-02.exe

Câu hỏi?

1. Làm thế nào để chương trình này đạt được sự kiên trì?

2. Mục đích của chương trình này là gì?

3. Khi nào chương trình này sẽ thực hiện xong?

Phân tích chi tiết

1 Thông tin tổng quan

Môi trường phân tích Windows 10 Flare VM
Mẫu phân tích Lab07-02.exe
Size 16.00 KB (16384 bytes)
MD5 7bbc691f7e87f0986a1030785268f190
Compiled Sunday 19 December 2010, 11.18.04

2 Công cụ sử dụng

3 Thực thi Lab07-02.exe

Nhấn đúp chay Lab07-02.exe trong máy Windows 10 Flare VM để xem những thay đổi. Ngay lập tức trình duyệt web sẽ mở kết nối đến trang web http://www.malwareanalysisbook.com/ad.html.

4 Phân tích Tĩnh

4.1 Sử dụng VirusTotal

Việc đầu tiên tải mẫu lên VirusTotal để kiểm tra.

https://www.virustotal.com/gui/file/bdf941defbc52b03de3485a5eb1c97e64f5ac0f54325e8cb668c994d3d8c9c90

Kết quả quét trên VirusTotal cho thấy mẫu được nhận diện là Trojan.

4.2 Kiểm tra Strings

Nội dung:
File: Lab07-02.exe
MD5:  7bbc691f7e87f0986a1030785268f190
Size: 16384

Ascii Strings:
---------------------------------------------------------------------------
0000004D  !This program cannot be run in DOS mode.
000000D0  Rich;
000001E8  .text
0000020F  `.rdata
00000237  @.data
00001013  Phh @
0000101D  hX @
0000106E  L$$QVP
00001095  hx @
000010AF   SVW
000010FF  =h0@
00001134  5p0@
000011A7  %( @
0000212E  OleUninitialize
00002140  CoCreateInstance
00002154  OleInitialize
00002162  ole32.dll
0000216C  OLEAUT32.dll
0000217C  _exit
00002184  _XcptFilter
00002192  exit
0000219A  __p___initenv
000021AA  __getmainargs
000021BA  _initterm
000021C6  __setusermatherr
000021DA  _adjust_fdiv
000021EA  __p__commode
000021FA  __p__fmode
00002208  __set_app_type
0000221A  _except_handler3
0000222C  MSVCRT.dll
0000223A  _controlfp

Unicode Strings:
---------------------------------------------------------------------------
00003010  http://www.malwareanalysisbook.com/ad.html

Một số chuỗi đáng chú ý đã được lọc ra như dưới đây:
0000212E  OleUninitialize
00002140  CoCreateInstance
00002154  OleInitialize
00002162  ole32.dll
0000216C  OLEAUT32.dll
00003010  http://www.malwareanalysisbook.com/ad.html
Từ quan sát string, ta thấy Lab07-02.exe có tương đối ít chuỗi. Có một chuỗi Unicode thể hiện URL là http://www.malwareanalysisbook.com/ad.html, có thể suy đoán rằng nó sẽ truy cập vào địa chỉ này.

Bên lề:

Các hàm SysFreeStringSysAllocStringVariantInitCoCreateInstanceOleInitialize, và OleUninitialize thường được sử dụng trong lập trình COM (Component Object Model) trên Windows. Trong phân tích mã độc, các hàm này thường liên quan đến việc thao tác với các đối tượng COM, quản lý chuỗi, hoặc xử lý các biến kiểu VARIANT. Việc hiểu rõ chức năng của chúng có thể giúp nhận diện các hành vi bất thường trong mã độc. Dưới đây là chi tiết về từng hàm:

1. SysAllocString

Hàm SysAllocString được sử dụng để tạo (cấp phát) một chuỗi kiểu BSTR.

  • Cú pháp:

BSTR SysAllocString(const OLECHAR *psz);

  • Tham số:
    • psz: Con trỏ đến chuỗi Unicode để sao chép vào chuỗi BSTR mới.
    • Trả về:
      • Con trỏ đến chuỗi BSTR đã được cấp phát. Nếu không cấp phát được (thiếu bộ nhớ), trả về NULL.
      • Ví dụ:
      BSTR bstr = SysAllocString(L"Hello, COM!");
      if (bstr != NULL) {
      // Sử dụng chuỗi bstr
      }
      SysFreeString(bstr); // Giải phóng bộ nhớ

      Trong phân tích mã độc:

      • Hàm này thường được sử dụng để cấp phát chuỗi cho các đối tượng COM hoặc truyền dữ liệu.
      • Kẻ tấn công có thể sử dụng SysAllocString để tạo ra các chuỗi độc hại trong bộ nhớ.

      2. SysFreeString

      Hàm SysFreeString được sử dụng để giải phóng bộ nhớ của một chuỗi BSTR đã được cấp phát trước đó.

      • Cú pháp:

      void SysFreeString(BSTR bstr);

      • Tham số:
        • bstr: Con trỏ đến chuỗi BSTR cần giải phóng.
        • Lưu ý:
          • Nếu chuỗi BSTR là NULL, hàm sẽ không làm gì.
          • Không sử dụng hàm này để giải phóng các kiểu chuỗi khác ngoài BSTR.
        • Ví dụ:
        BSTR bstr = SysAllocString(L"Hello, COM!");
        if (bstr != NULL) {
            // Sử dụng bstr
        }
        SysFreeString(bstr); // Giải phóng sau khi sử dụng

        Trong phân tích mã độc:

        Nếu mã độc không giải phóng chuỗi, có thể dẫn đến rò rỉ bộ nhớ, nhưng cũng có trường hợp cố tình làm vậy để giữ chuỗi độc hại trong bộ nhớ lâu hơn.

        3. VariantInit

        Hàm VariantInit được sử dụng để khởi tạo một biến kiểu VARIANT. Biến VARIANT là một kiểu dữ liệu đa năng được sử dụng rộng rãi trong COM.

        • Cú pháp:

        void VariantInit(VARIANTARG *pvarg);

        • Tham số:
          • pvarg: Con trỏ đến biến VARIANT cần khởi tạo.
        • Lưu ý:
          • Hàm này đặt giá trị mặc định cho biến VARIANT và đặt kiểu của nó là VT_EMPTY.
          • Sau khi sử dụng biến VARIANT, bạn cần giải phóng bằng hàm VariantClear.
        • Ví dụ:
        VARIANT var;
        VariantInit(&var); // Khởi tạo biến VARIANT
        
        var.vt = VT_BSTR;
        var.bstrVal = SysAllocString(L"Hello, VARIANT!");
        
        VariantClear(&var); // Giải phóng

         Trong phân tích mã độc:

        • Hàm này có thể xuất hiện khi mã độc sử dụng các đối tượng COM hoặc các hàm tự động hóa OLE.
        • Kiểm tra dữ liệu được lưu trong biến VARIANT có thể cho thấy các dữ liệu đáng ngờ.

        4. CoCreateInstance

        Hàm CoCreateInstance được sử dụng để tạo một đối tượng COM.

        • Cú pháp:
        HRESULT CoCreateInstance(
            REFCLSID rclsid,
            LPUNKNOWN pUnkOuter,
            DWORD dwClsContext,
            REFIID riid,
            LPVOID *ppv
        );
        • Tham số:
          • rclsid: CLSID của đối tượng COM cần tạo.
          • pUnkOuter: Con trỏ đến đối tượng ngoài trong trường hợp "aggregation" (nếu không, truyền NULL).
          • dwClsContext: Ngữ cảnh (ví dụ: CLSCTX_INPROC_SERVER cho DLL, CLSCTX_LOCAL_SERVER cho EXE).
          • riid: Interface ID mà bạn muốn nhận.
          • ppv: Con trỏ để nhận đối tượng COM mới tạo.
        • Trả về:
          • S_OK: Thành công.
          • Mã lỗi HRESULT khác nếu thất bại.
        • Ví dụ:
        IUnknown* pUnknown = NULL;
        
        HRESULT hr = CoCreateInstance(CLSID_SomeCOMObject, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
        
        if (SUCCEEDED(hr)) {
            // Sử dụng pUnknown
            pUnknown->Release(); // Giải phóng đối tượng COM
        }

         Trong phân tích mã độc:

        • Đây là một hàm quan trọng, thường bị lạm dụng bởi mã độc để truy cập các thành phần hệ thống như WMI, Shell.Application, hoặc các API quản lý file.
        • Các CLSID hoặc IID đáng ngờ có thể tiết lộ hành vi độc hại.

        5. OleInitialize

        Hàm OleInitialize được sử dụng để khởi tạo thư viện OLE (Object Linking and Embedding). Nó thường được gọi trước khi sử dụng các chức năng OLE hoặc COM.

        • Cú pháp:

        HRESULT OleInitialize(LPVOID pvReserved);

        • Tham số:
          • pvReserved: Luôn đặt là NULL.
        • Trả về:
          • S_OK nếu thành công.
          • S_FALSE nếu OLE đã được khởi tạo trước đó.
          • Mã lỗi HRESULT khác nếu thất bại.
        • Lưu ý:
          • Khi không cần sử dụng nữa, bạn phải gọi OleUninitialize.
        • Ví dụ:
        HRESULT hr = OleInitialize(NULL);
        if (SUCCEEDED(hr)) {
            // Sử dụng OLE
            OleUninitialize(); // Hủy khởi tạo
        }

        Trong phân tích mã độc:

        • Hàm này có thể xuất hiện khi mã độc chuẩn bị thao tác với OLE hoặc tự động hóa COM.
        • Thường được kết hợp với CoCreateInstance hoặc các API khác.

        6. OleUninitialize

        Hàm OleUninitialize được sử dụng để dọn dẹp và hủy khởi tạo thư viện OLE.

        • Cú pháp:

        void OleUninitialize();

        • Lưu ý:
          • Phải gọi hàm này khi không cần sử dụng OLE nữa.
          • Hàm này đối ứng với OleInitialize.
        • Ví dụ:
        OleInitialize(NULL);
        // Sử dụng OLE
        OleUninitialize(); // Hủy khởi tạo sau khi sử dụng

         Trong phân tích mã độc:

        • Có thể không được gọi trong mã độc, vì kẻ tấn công không quan tâm đến việc giải phóng tài nguyên.
        • Việc bỏ qua bước này có thể dẫn đến hành vi bất thường trong quá trình phân tích.

        Tóm tắt ngắn gọn:

        Hàm Mô tả
        SysAllocString Cấp phát bộ nhớ và tạo chuỗi kiểu BSTR.
        SysFreeString Giải phóng bộ nhớ của chuỗi BSTR.
        VariantInit Khởi tạo một biến kiểu VARIANT.
        CoCreateInstance Tạo một đối tượng COM dựa trên CLSID và IID.
        OleInitialize Khởi tạo thư viện OLE trước khi sử dụng các chức năng liên quan.
        OleUninitialize Hủy khởi tạo thư viện OLE khi không cần sử dụng nữa.

         Các hàm này là nền tảng của lập trình COM trong Windows và được sử dụng rộng rãi khi xây dựng hoặc tương tác với các ứng dụng COM hoặc OLE.

        4.3 Sử dụng IDA Pro

        IDA Pro được sử dụng để phân tích tĩnh chi tiết. Mở Lab07-02.exe với IDA Pro (Phiên bản tôi đang dùng là bản IDA Pro 9.0). IDA View-A của Lab07-02.exe như ảnh chụp màn hình dưới đây.


        Ta thấy Lab07-02.exe có cấu trúc tương đối đơn giản và không có chương trình con (subroutine) nào được gọi.

        4.3.1 Kiểm tra các hàm Import

        • ole32.dll: Thư viện này gồm các hàm liên quan đến COM (Component Object Model) (ví dụ: OleInitialize, CoCreateInstance, OleUninitialize). Đây là dấu hiệu quan trọng cho thấy mã độc sử dụng COM.
        • oleaut32.dll: Thư viện này gồm các hàm hỗ trợ cho OLE và COM (ví dụ: VariantInit).

        4.3.2 Phân tích hàm main

        Nhấn phím Space để chuyển sang chế độ Graph của hàm main:

        Hàm main bao gồm ba khối chính ,  và .

        Tiếp theo vào menu View | Graphs | Flow chart để xem chở chế độ Flow chart của hàm:

        Phân tích chức năng chính của hàm main:

        a. Khởi tạo COM:

        • Hàm OleInitialize được gọi ở đầu hàm để khởi tạo môi trường COM (Component Object Model). Điều này gợi ý rằng chương trình có thể sử dụng các đối tượng COM để thực hiện các tác vụ.
        • Nếu thất bại (trả về giá trị khác 0), chương trình sẽ nhảy tới nhãn loc_401085 để kết thúc.

        b. Tạo một đối tượng COM:

        • Lời gọi hàm CoCreateInstance được sử dụng để tạo một đối tượng COM, hàm CoCreateInstance có 5 tham số được đẩy vào stack:
          • rclsid: Class ID của đối tượng cần tạo.
          • pUnkOuter: Giá trị NULL (đối tượng không thuộc đối tượng bao bọc khác).
          • dwClsContext: Giá trị 4 (CLSCTX_INPROC_SERVER), cho biết đối tượng sẽ được tạo trong quy trình hiện tại.
          • riid: ID giao diện của đối tượng.
          • ppv: Con trỏ đến con trỏ void sẽ nhận địa chỉ của đối tượng mới tạo.
        • Nếu đối tượng COM không được tạo thành công (giá trị trả về khác 0), chương trình sẽ nhảy đến loc_40107F để giải phóng tài nguyên.

        c. Xử lý chuỗi và URL:

        • VariantInit: Được sử dụng để khởi tạo biến kiểu VARIANT, một kiểu dữ liệu được dùng trong COM.
        • SysAllocString: Phân bổ chuỗi BSTR - Binary String hoặc Basic String (chuỗi được sử dụng trong môi trường COM).

        d. Gọi phương thức COM:

        • Một phương thức của đối tượng COM được gọi thông qua con trỏ đối tượng tại địa chỉ [edx+2Ch].

        e. Giải phóng tài nguyên:

        • SysFreeString: Chuỗi BSTR được giải phóng sau khi sử dụng.
        • OleUninitialize: Giải phóng môi trường COM trước khi kết thúc chương trình.

        f. Kết thúc chương trình:

        • Hàm thực hiện dọn dẹp stack và trả về.

        Kết luận về chức năng của hàm main:

        1. Khởi tạo môi trường COM (Component Object Model) để làm việc với các đối tượng COM thông qua hàm OleInitialize.
        2. Tạo và khởi tạo một đối tượng COM, có thể dùng để gửi hoặc xử lý thông tin bằng cách sử dụng CoCreateInstance.
        3. Xử lý URL, có khả năng thực hiện một số tác vụ với URL được cung cấp (có thể liên quan đến việc tải dữ liệu từ internet).
        4. Giải phóng tài nguyên và kết thúc chương trình bằng cách gọi SysFreeString và OleUninitialize.
        Lưu ý: Nếu như ở Lab07_01.exe thì các chức năng về mạng (InternetOpenUrlAInternetOpenA,..) sẽ xuất hiện khi phân tích chuỗi nhưng trong lab này thông tin về API mạng không được hiển thị mà chỉ có một URL http://www.malwareanalysisbook.com/ad.html. Như vậy có thể đoán rằng phơng thức kết nối đến URL là phương thức khác.

        4.3.3 Phân tích csid iid

        Bấm đúp vào vị trí khoanh như ảnh chụp ở trên IDA Pro sẽ chuyển đến chi tiết rdata của riidrclsid.


        Bên lề:

        Trong lập trình COM (Component Object Model) của Microsoft, rclsidriid là hai khái niệm quan trọng để tạo và sử dụng các đối tượng COM. Dưới đây là giải thích về chúng:

        CLSID (Class Identifier) - rclsid:

        • Định nghĩa: CLSID là một GUID (Globally Unique Identifier - Mã định danh duy nhất toàn cầu) 128-bit (16 byte), được sử dụng để định danh một lớp COM cụ thể. Có thể hiểu nó như là "tên" của một lớp đối tượng COM.
        • Vai trò: Khi bạn muốn tạo một đối tượng COM, bạn cần biết CLSID của lớp mà bạn muốn tạo. CLSID cho phép hệ thống tìm thấy và tải đúng mã (DLL hoặc EXE) chứa việc triển khai của lớp đó.
        • Ví dụ: CLSID của Internet Explorer là {0002DF01-0000-0000-C000-000000000046}. Khi một chương trình muốn tạo một instance (thể hiện) của Internet Explorer thông qua COM, nó sẽ sử dụng CLSID này.
        • Lưu trữ: CLSID thường được lưu trữ trong Registry của Windows dưới khóa HKEY_CLASSES_ROOT\CLSID.

        IID (Interface Identifier) - riid:

        • Định nghĩa: IID cũng là một GUID 128-bit (16 byte), được sử dụng để định danh một giao diện COM cụ thể. Một giao diện định nghĩa một tập hợp các phương thức mà một đối tượng COM hỗ trợ.
        • Vai trò: Một lớp COM có thể triển khai nhiều giao diện. IID cho phép client (chương trình sử dụng COM) yêu cầu một giao diện cụ thể từ đối tượng. Điều này cho phép tính đa hình và khả năng mở rộng trong COM.
        • Ví dụ: Giao diện IWebBrowser2 (một giao diện được Internet Explorer triển khai) có một IID riêng. Khi một chương trình muốn sử dụng các chức năng duyệt web cơ bản của Internet Explorer thông qua COM, nó sẽ yêu cầu giao diện IWebBrowser2 bằng IID của nó.
        • Lưu trữ: IID cũng thường được lưu trữ trong Registry của Windows, thường là dưới khóa HKEY_CLASSES_ROOT\Interface.

        Ví dụ minh họa:

        Ví dụ 1

        Hãy tưởng tượng bạn có một chiếc TV (lớp - CLSID). Chiếc TV này có thể được điều khiển bằng nhiều cách khác nhau (giao diện - IID):

        • Điều khiển từ xa (IID_RemoteControl): Cho phép bạn bật/tắt TV, thay đổi kênh, âm lượng.
        • Bảng điều khiển trên TV (IID_PanelControl): Cho phép bạn điều khiển bằng các nút bấm trực tiếp trên TV.
        • Điều khiển bằng giọng nói (IID_VoiceControl): Cho phép bạn điều khiển TV bằng giọng nói.

        CLSID của chiếc TV sẽ xác định loại TV đó (ví dụ: TV Samsung Model XYZ). IID sẽ xác định cách bạn tương tác với TV. Bạn có thể sử dụng điều khiển từ xa (IID_RemoteControl), hoặc bạn có thể sử dụng bảng điều khiển trên TV (IID_PanelControl), tùy thuộc vào nhu cầu và khả năng của bạn.

        Ví dụ 2

        Bạn muốn mua một món đồ chơi (đối tượng COM).

        • rclsid (CLSID) giống như tên của cửa hàng đồ chơi: Nó cho biết bạn cần đến cửa hàng nào để mua món đồ chơi đó. Ví dụ: "Cửa hàng đồ chơi ABC", "Siêu thị đồ chơi XYZ". Mỗi cửa hàng có một tên riêng để phân biệt.
        • riid (IID) giống như loại đồ chơi bạn muốn mua trong cửa hàng đó: Ví dụ: "Xe ô tô điều khiển từ xa", "Búp bê Barbie", "Bộ xếp hình Lego". Trong một cửa hàng, có thể có nhiều loại đồ chơi khác nhau.

        Tóm lại:

        • rclsid (CLSID) định danh một lớp COM.
        • riid (IID) định danh một giao diện COM.
        • Cả hai đều là GUID và được sử dụng cùng nhau để tạo và sử dụng các đối tượng COM.

        Như vậy căn cứ vào ảnh chụp hiển thị rdata của riidrclsid ở phía trên thì có thể hiểu đoạn mã đó như sau:

        rclsid     IID <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>
        GUID này được biểu diễn:
        • 2DF01h: Phần đầu tiên (DWORD) là 0x0002DF01.
        • 0: Phần thứ hai (WORD) là 0x0000.
        • 0: Phần thứ ba (WORD) là 0x0000.
        • <0C0h, 0, 0, 0, 0, 0, 0, 46h>: Phần cuối cùng (8 byte) là 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x46.
        Kết hợp lại, CLSID này là {0002DF01-0000-0000-C000-000000000046} . Đây chính là CLSID của Internet Explorer.
        riid     IID <0D30C1661h, 0CDAFh, 11D0h, <8Ah, 3Eh, 0, 0C0h, 4Fh, 0C9h, 0E2h, 6Eh>>
        GUID này được biểu diễn:
        • 0D30C1661h: Phần đầu tiên (DWORD) là 0xD30C1661.
        • 0CDAFh: Phần thứ hai (WORD) là 0xCDAF.
        • 11D0h: Phần thứ ba (WORD) là 0x11D0.
        • <8Ah, 3Eh, 0, 0C0h, 4Fh, 0C9h, 0E2h, 6Eh>: Phần cuối cùng (8 byte) là 0x8A 0x3E 0x00 0xC0 0x4F 0xC9 0xE2 0x6E.
        Kết hợp lại, IID này là {D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}. Đây chính là IID của giao diện IWebBrowser2. Giao diện này cung cấp các phương thức để điều khiển trình duyệt web, ví dụ như điều hướng đến một URL, lấy nội dung trang web, v.v.

        Tóm lại:

        Đoạn mã này định nghĩa CLSID của Internet Explorer và IID của giao diện IWebBrowser2. Sự hiện diện của nó trong mã độc là một dấu hiệu mạnh mẽ cho thấy mã độc đang lợi dụng Internet Explorer cho các mục đích xấu.

        Bên lề:

        Giải thích thêm về cách biểu diễn một IID (Interface Identifier) trong IDA Pro để tránh nhầm lẫn. Lấy ví dụ biểu diễn này: IID <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>

        Giải thích chi tiết:

        • IID: Đây là từ khóa cho biết đây là một Interface Identifier. IID là một loại GUID (Globally Unique Identifier) được sử dụng để xác định duy nhất một interface COM (Component Object Model).
        • <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>: Đây là cách IDA Pro (hoặc một số công cụ khác) biểu diễn các thành phần của cấu trúc GUID (hoặc IID). Cấu trúc GUID được định nghĩa như sau trong C/C++:
        C++
        typedef struct _GUID {
            DWORD Data1;
            WORD Data2;
            WORD Data3;
            BYTE Data4[8];
        } GUID;

        Trong biểu diễn của ví dụ này thì:

        • 2DF01h: Đây là giá trị của Data1 (DWORD - 4 byte tương đương 32bit). Chữ h ở cuối cho biết đây là giá trị hex.
        • 0: Đây là giá trị của Data2 (WORD - 2 byte tương đương 16 bit).
        • 0: Đây là giá trị của Data3 (WORD - 2 byte tương đương 16 bit).
        • <0C0h, 0, 0, 0, 0, 0, 0, 46h>: Đây là giá trị của Data4 (mảng 8 byte). Các giá trị được liệt kê theo thứ tự byte.

        Chuyển đổi sang định dạng GUID chuẩn:

        Để chuyển đổi biểu diễn trên sang định dạng GUID chuẩn xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, bạn cần thực hiện các bước sau:

        1. Đảo ngược thứ tự byte trong Data1, Data2, và Data3: Đây là do kiến trúc little-endian phổ biến trên Windows.

        • 2DF01h (01 DF 02 00) trở thành 0002DF01
        • 0 trở thành 0000
        • 0 trở thành 0000

        2. Giữ nguyên thứ tự byte trong Data4:

        • 0C0h, 0, 0, 0, 0, 0, 0, 46h trở thành C000000000000046

        3. Kết hợp các phần và thêm dấu gạch ngang:

        • 0002DF01-0000-0000-C000-000000000046

        Kết quả:

        Dựa trên các phần đã phân tích ở trên, IID này sẽ được biểu diễn tương ứng như sau:

        IID <2DF01h, 0, 0, <0C0h, 0, 0, 0, 0, 0, 0, 46h>>
        GUID {0002DF01-0000-0000-C000-000000000046}
        Định dạng GUID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

        Đây chính là CLSID của Internet Explorer.


        Bây giờ chúng ta kiểm tra các ID này có chức năng gì. Trong máy Windows VM nhấn đồng thời Windows +R để mở hộp thoại Run. regedit để mở trình Registry Editor.

        • CLSID nằm trong \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID.
        CLSID là tệp sẽ được thực thi khi mã độc này được chạy bởi Internet Explorer để tạo ra một đối tượng.

        • IID nằm trong \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface{IID}
        (Tìm IID này mất khá nhiều thời gian hơn 😤 với CLSID nên trong hình dưới đây tôi không đánh số tự tự nữa).
        IID là interface (giao diện) dành cho chức năng duyệt web được cung cấp bởi COM, cụ thể là IWebBrowser2.


        Bên lề:
        Trong ngôn ngữ assembly, dấu ngoặc vuông [] được sử dụng để biểu thị việc truy cập bộ nhớ tại một địa chỉ cụ thể. Nó hoạt động tương tự như con trỏ trong các ngôn ngữ lập trình cấp cao như C/C++. Dưới đây là giải thích chi tiết:
        Cách hoạt động của [] trong assembly:
        Truy cập giá trị tại địa chỉ trong thanh ghi:
           mov eax, [ebx]
            Ý nghĩa: Lấy giá trị tại địa chỉ được lưu trong thanh ghi ebx và lưu nó vào thanh ghi eax.
            Tương tự trong C: eax = *ebx;
        Ghi giá trị vào một địa chỉ:
           mov [ebx], eax
            Ý nghĩa: Ghi giá trị trong thanh ghi eax vào địa chỉ được chỉ định bởi ebx.
            Tương tự trong C: *ebx = eax;
        Cách truy cập với địa chỉ phức tạp:
         1. Dùng offset (dịch địa chỉ):
           mov eax, [ebx+4]
            Ý nghĩa: Lấy giá trị tại địa chỉ ebx + 4 và lưu vào thanh ghi eax.
            Tương tự trong C: eax = *(ebx + 4);
        2. Dùng nhiều thanh ghi:
           mov eax, [ebx+ecx]
            Ý nghĩa: Lấy giá trị tại địa chỉ ebx + ecx và lưu vào eax.
            Tương tự trong C: eax = *(ebx + ecx);
        3. Dùng tỉ lệ (scale):
           mov eax, [ebx+ecx*4]
            Ý nghĩa: Lấy giá trị tại địa chỉ ebx + ecx * 4 và lưu vào eax. Điều này hữu ích khi truy cập các phần tử mảng với kích thước phần tử là 4 byte (ví dụ: int).
            Tương tự trong C: eax = *(ebx + ecx * 4);
        Ví dụ từ đoạn mã trên:
            Trong đoạn mã của bạn có dòng:
           mov edx, [eax]
            Ý nghĩa: Lấy giá trị tại địa chỉ mà thanh ghi eax trỏ tới và lưu vào thanh ghi edx.
           Tương tự trong C: edx = *eax;
            Và dòng:
           call dword ptr [edx+2Ch]
            Ý nghĩa: Lấy giá trị tại địa chỉ edx + 2Ch (44 byte từ địa chỉ trong edx) và thực hiện một lời gọi hàm đến địa chỉ đó.
            Tương tự trong C: ((void (*)())(*(edx + 0x2C)))();
        Lưu ý khi sử dụng []:
           1 Phân biệt địa chỉ và giá trị:
           mov eax, ebx → Sao chép giá trị trong ebx vào eax.
           mov eax, [ebx] → Lấy giá trị tại địa chỉ ebx và lưu vào eax.
           2. Quản lý offset và scale: Rất quan trọng trong việc thao tác với mảng và cấu trúc dữ liệu phức tạp.

        4.3.4 Xác định chi tiết hàm call dword ptr [edx+2Ch]

        Lệnh call dword ptr [edx+2Ch] khác với các hàm được định nghĩa rõ ràng trong mã nguồn. Lý do chính là:

        • Địa chỉ tính toán động: Địa chỉ của hàm không được xác định rõ ràng mà được tính toán tại thời điểm thực thi dựa trên giá trị của thanh ghi edx và offset 2Ch. Điều này khiến IDA Pro khó xác định chính xác hàm này là gì.
        • Có thể là một con trỏ đến một hàm trong thư viện động: Địa chỉ này có thể trỏ đến một hàm nằm trong một thư viện động (DLL), và IDA Pro có thể chưa có thông tin về các hàm trong thư viện đó.
        • Hàm có thể được mã hóa hoặc obfuscated: Mã của hàm có thể được mã hóa hoặc làm khó hiểu để ngăn cản việc phân tích.

        Do đó, để phân tích chi tiết hơn, chúng ta sử dụng chức năng structures trong IDA Pro.

        Sử dụng Structures trong IDA Pro để phân tích:

        Structures là một công cụ mạnh mẽ trong IDA Pro giúp bạn tạo các cấu trúc dữ liệu tùy chỉnh để mô tả các vùng nhớ trong chương trình. Bằng cách tạo một cấu trúc phù hợp, bạn có thể:

        • Hiểu rõ hơn về dữ liệu: Biết được các thành phần của một cấu trúc dữ liệu, mối quan hệ giữa các thành phần đó.
        • Dễ dàng truy cập các thành phần: Bạn có thể truy cập trực tiếp đến các thành phần của cấu trúc bằng tên thay vì phải tính toán offset.
        • Tìm kiếm các mẫu: Bạn có thể tìm kiếm các cấu trúc tương tự trong toàn bộ chương trình.

        Các bước sử dụng Structures:

        1. Đặt con trỏ

        Đặt con trỏ tại vị trí của lệnh call dword ptr [edx+2Ch].

        2. Mở cửa sổ Structures

        Chọn menu View | Open subviews | Structures (hoặc nhấn Shift+F9).

        Cửa sổ Structures mở ra.

        3. Thêm kiểu cấu trúc (Structure Type

        Sau khi cửa sổ Structures xuất hiện, thực hiện các bước sau:

        • Chọn menu Edit | Add stuct type... (hoặc nhấn phím Insert).

        • Hộp thoại Create structure/union xuất hiện.

        4. Thêm cấu trúc chuẩn (Standard Structure):

        Trong hộp thoại Create structure/union:

        • Click vào nút Add standard structure.
        • Tìm kiếm và chọn IwebBrowser2Vtbl (có thể dùng chọn tùy chọn Search để tìm) trong danh sách các cấu trúc chuẩn.
        • Nhấn OK.

        5. Kiểm tra cấu trúc

        Sau khi nhấn OK, IDA sẽ chuyển đến vị trí của IwebBrowser2Vtbl trong tab Structures. Tại đây, bạn có thể xem định nghĩa của cấu trúc này, bao gồm các thành viên (members) và offset của chúng.

        6. Áp dụng cấu trúc vào lệnh gọi

        Quay trở lại tab IDA View-A, tại vị trí lệnh gọi call dword ptr [edx+2Ch]:

        •  Nhấn chuột phải vào dòng lệnh đó.
        • Chọn tùy chọn [edx+IwebBrowser2Vtbl.Navigate]như trong ảnh chụp ở dưới. Tùy chọn này sẽ hiển thị nếu IDA đã nhận diện chính xác offset 2Ch (tức 44 byte theo hệ thập phân) tương ứng với hàm Navigate.

        7. Kết quả

        Sau bước trên, lệnh call dword ptr [edx+2Ch] đã được thay thế bằng dword ptr [edx+IwebBrowser2Vtbl.Navigate].

        Lúc này IDA Pro sẽ nhận diện dword ptr [edx+2Ch] là một hàm có tên là Navigate.

        Tóm lại sau khi dùng Cấu trúc để phân tích thì chúng ta biết được lệnh call dword ptr [edx+2Ch] sẽ gọi IWebBrowser2.

        Bên lề:

        Trong IWebBrowser2, phương thức Navigate được khai báo như sau:

        HRESULT Navigate(
           BSTR        URL,
           VARIANT*    Flags,
           VARIANT*    TargetFrameName,
           VARIANT*    PostData,
           VARIANT*    Headers
        );

        Giải thích các tham số

        1. URL (BSTR):
          • URL mà trình duyệt sẽ điều hướng tới.
          • Đây là một chuỗi Unicode chứa địa chỉ trang web hoặc tài nguyên (http, https, file, ftp, ...).
        2. Flags (VARIANT*):
          • Cờ điều khiển kiểu điều hướng.
          • Là một VARIANT chứa giá trị kiểu số (VT_I4) hoặc NULL.
          • Các giá trị có thể bao gồm:
            • navOpenInNewWindow (0x1): Mở URL trong cửa sổ trình duyệt mới.
            • navNoHistory (0x2): Không lưu URL vào lịch sử trình duyệt.
            • navNoReadFromCache (0x4): Không đọc nội dung từ bộ nhớ đệm.
            • navNoWriteToCache (0x8): Không ghi nội dung vào bộ nhớ đệm.
        3. TargetFrameName (VARIANT*):
          • Tên của khung (frame) mà URL sẽ được mở.
          • Nếu là NULL hoặc chuỗi rỗng (""), URL sẽ mở trong khung hiện tại.
          • Nếu là " _blank", URL sẽ mở trong cửa sổ hoặc tab mới.
        4. PostData (VARIANT*):
          • Dữ liệu cần gửi tới URL bằng phương thức HTTP POST.
          • Thường là một chuỗi byte hoặc dữ liệu nhị phân.
          • Nếu không có dữ liệu, truyền NULL.
        5. Headers (VARIANT*):
          • Chuỗi chứa các tiêu đề HTTP bổ sung (HTTP headers).
          • Ví dụ: "Content-Type: application/x-www-form-urlencoded\r\nCustom-Header: Value\r\n".

        Giá trị trả về

        • HRESULT:
          • S_OK: Thành công.
          • Các giá trị lỗi khác: Lỗi cụ thể xảy ra trong quá trình thực thi.

        Trả lời Câu hỏi

        1. Làm thế nào để chương trình này đạt được sự kiên trì?

        Nó không tiếp diễn/tiếp tục. Trên đồ thị cũng không hiển thị dạng vòng lặp, và trong code cũng không có phần nào lặp lại.

        Graph overview Strings

        2. Mục đích của chương trình này là gì?

        Tạo một đối tượng COM và sử dụng phương thức Navigate để kết nối đến http://www.malwareanalysisbook.com/ad.html.

        3. Khi nào chương trình này sẽ thực hiện xong?

        Chương trình sẽ hoàn thành sau khi kết nối đến URL http://www.malwareanalysisbook.com/ad.html bằng Internet Explorer và hiển thị trang web.

        Tổng kết bài Lab07-02.exe

        Phương thức Navigate trong mã độc là một cách mà các tác giả mã độc sử dụng để tự động điều hướng trình duyệt web hoặc thực thi các hành động liên quan đến trình duyệt mà không cần tương tác trực tiếp từ người dùng. Phương thức này thường được khai thác thông qua giao diện IWebBrowser2 của COM (Component Object Model) để thao tác với Internet Explorer (hoặc các thành phần tương tự).

        Trong mã độc, phương thức Navigate được sử dụng để:

        1.      Tự động điều hướng đến các trang web độc hại:

        • Dẫn người dùng đến các trang phishing (giả mạo) để lấy cắp thông tin nhạy cảm như tài khoản ngân hàng, mật khẩu, hoặc thông tin cá nhân.
        • Mở trang chứa mã khai thác lỗ hổng (exploit kits) để cài đặt thêm mã độc vào hệ thống nạn nhân.

        2.      Tải nội dung hoặc payload độc hại:

        • Navigate có thể được sử dụng để tải xuống các tệp thực thi độc hại hoặc các file script từ server điều khiển (Command and Control - C2).
        • Gửi dữ liệu nhạy cảm hoặc thông tin thu thập được từ nạn nhân về server điều khiển.

        3.      Che giấu hoạt động độc hại:

        • Thay vì hiển thị cửa sổ trình duyệt rõ ràng, mã độc có thể chạy trình duyệt ở chế độ ẩn và sử dụng Navigate để thực thi các hành động trong nền.
        • Ví dụ: Điều hướng đến quảng cáo để thực hiện click fraud (lừa đảo quảng cáo).

        4.      Thực hiện các cuộc tấn công mạng tự động:

        • Điều hướng đến các URL có chứa tham số tấn công nhằm khai thác các dịch vụ web hoặc API (ví dụ: SQL injection, Cross-Site Scripting - XSS).
        • Tự động gửi yêu cầu POST hoặc GET chứa mã độc.
        Bên lề:

        Phân tích mã độc sử dụng Navigate trong IDA Pro đòi hỏi hiểu cách mã độc tương tác với IWebBrowser2 thông qua bảng VTable để thực hiện các hành vi độc hại như tải xuống payload, truyền thông dữ liệu hoặc mở trang web độc hại. Dưới đây là hướng dẫn chi tiết về cách phân tích mã độc có sử dụng Navigate trong IDA Pro.

        1. Hiểu về hàm Navigate trong ngữ cảnh mã độc

        • Navigate là một phương thức của giao diện IWebBrowser2, được sử dụng để điều hướng đến một URL hoặc gửi yêu cầu HTTP.
        • Trong mã độc, phương thức này thường được sử dụng để:
          • Tải xuống payload từ máy chủ điều khiển (C2 server).
          • Gửi dữ liệu đánh cắp (sử dụng POST request).
          • Điều hướng nạn nhân đến trang web độc hại (phishing, drive-by download).

        2. Quy trình phân tích mã độc có hàm Navigate trong IDA Pro

        2.1. Bước 1: Tìm kiếm dấu hiệu của COM

        Mã độc sử dụng Navigate phải khởi tạo đối tượng IWebBrowser2. Điều này thường được thực hiện thông qua API COM, cụ thể là CoCreateInstance. Vì vậy, bạn cần:

        1. Tìm lời gọi đến CoCreateInstance:
          • Trong cửa sổ Imports, tìm CoCreateInstance.
          • Nếu mã độc không sử dụng API Imports trực tiếp, bạn có thể tìm các lời gọi gián tiếp thông qua assembly (VD: call eax hoặc call edx).
        2. Kiểm tra CLSID và IID được sử dụng:
          • CLSID của IWebBrowser2: {0002DF01-0000-0000-C000-000000000046}
          • IID của IWebBrowser2: {D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}

        Ví dụ trong assembly:

        push offset IID_IWebBrowser2     ; IID của IWebBrowser2
        push offset CLSID_InternetExplorer ; CLSID của Internet Explorer
        push 0
        push 1

        2.2. Bước 2: Xác định bảng VTable

        • Sau khi khởi tạo, đối tượng COM sẽ trỏ đến bảng VTable. Bạn có thể xác định điều này bằng cách theo dõi con trỏ đối tượng (ecx, esi, hoặc eax).
        • VTable chứa con trỏ hàm của các phương thức COM, trong đó Navigate thường nằm ở offset 0x28 (40 bytes).

        Trong IDA, bạn sẽ thấy các lệnh tương tự:

        mov eax, [ecx]       ; Lấy con trỏ VTable từ đối tượng IWebBrowser2
        mov edx, [eax+28h]   ; Lấy hàm Navigate từ offset 0x28
        call edx             ; Gọi hàm Navigate

        2.3. Bước 3: Phân tích lời gọi Navigate

        Khi gọi Navigate, các tham số được đẩy vào stack theo thứ tự sau:

        1. Headers (tùy chọn): Tiêu đề HTTP bổ sung.
        2. PostData (tùy chọn): Dữ liệu POST gửi đến máy chủ.
        3. TargetFrameName (tùy chọn): Frame mục tiêu hoặc NULL.
        4. Flags (tùy chọn): Các cờ điều khiển hành vi điều hướng.
        5. URL: Chuỗi chứa địa chỉ URL cần điều hướng.

        Ví dụ trong assembly:

        push offset Headers       ; HTTP Headers
        push offset PostData      ; POST Data
        push 0                    ; TargetFrameName = NULL
        push 0                    ; Flags = 0
        push offset URL           ; URL để điều hướng
        mov ecx, pIWebBrowser2    ; Đối tượng IWebBrowser2
        call edx                  ; Gọi hàm Navigate

        2.4. Bước 4: Xác định tham số URL và POST

        • Tìm tham số URL:
          • Trong cửa sổ Strings (Shift+F12), tìm kiếm các chuỗi URL khả nghi.
          • Dò ngược từ nơi chuỗi được tham chiếu để xác định nó được đẩy vào stack ở đâu.

        Ví dụ:

        push offset URL           ; URL = "http://malicious.com"
        • Tìm tham số POST:
          • Nếu có dữ liệu POST, nó thường là một mảng byte (hoặc cấu trúc dữ liệu) được chuẩn bị trước khi gọi Navigate.
          • Kiểm tra bộ nhớ nơi dữ liệu này được khởi tạo hoặc chỉnh sửa.
        • Headers (nếu có):
          • Tương tự, kiểm tra các tham số Headers nếu được sử dụng.

        2.5. Bước 5: Phân tích hành vi của mã độc

        Khi bạn đã xác định lời gọi Navigate và các tham số, bạn cần phân tích hành vi mã độc:

        • URL: Kiểm tra URL độc hại để xem nó trỏ đến tài nguyên gì (phishing site, C2 server...).
        • PostData: Phân tích dữ liệu POST để xác định xem mã độc gửi thông tin gì (như thông tin đăng nhập, dữ liệu đánh cắp).
        • Headers: Kiểm tra xem mã độc có sử dụng headers đặc biệt để ngụy trang hay không.

        3. Ví dụ thực tế

        3.1. Đoạn mã giả lập trong IDA Pro

        .text:00401100 mov     eax, [ecx]
        .text:00401102 mov     edx, [eax+28h]    ; Offset 0x28: Navigate
        .text:00401105 push    offset Headers    ; HTTP Headers
        .text:0040110A push    offset PostData   ; POST Data
        .text:0040110F push    0                 ; TargetFrameName = NULL
        .text:00401111 push    0                 ; Flags = 0
        .text:00401113 push    offset URL        ; URL = "http://malicious.com"
        .text:00401118 mov     ecx, [esi+8]      ; IWebBrowser2 object
        .text:0040111B call    edx               ; Call Navigate

        3.2. Phân tích mã độc

        1. URL:
          • "http://malicious.com": Máy chủ C2 của mã độc.
          • URL này có thể chứa payload hoặc trang phishing.
        2. POST Data:
          • Nếu có dữ liệu POST, mã độc có thể đang gửi thông tin nhạy cảm (như mật khẩu, cookie).
        3. Headers:
          • Headers có thể chứa chuỗi User-Agent giả mạo.

        4. Công cụ và kỹ thuật hỗ trợ

        4.1. Công cụ hỗ trợ

        1. Wireshark:
          • Phân tích lưu lượng mạng để xem kết nối đến URL độc hại.
        2. x64dbg/OllyDbg:
          • Đặt breakpoint tại lời gọi Navigate hoặc CoCreateInstance để phân tích runtime.
        3. VirusTotal/Any.Run:
          • Phân tích URL độc hại.

        4.2. Kỹ thuật nâng cao

        1. Dynamic Analysis:
          • Chạy mã độc trong môi trường sandbox để kiểm tra hành vi mạng thực tế.
        2. Code Injection:
          • Một số mã độc sử dụng Code Injection để nhúng lời gọi Navigate vào một tiến trình khác.

        5. Tóm tắt

        • Navigate trong IWebBrowser2 thường được sử dụng bởi mã độc để giao tiếp với máy chủ điều khiển.
        • Trong IDA Pro, phân tích tập trung vào:
          • Lời gọi CoCreateInstance để khởi tạo COM.
          • Offset 0x28 trong VTable của IWebBrowser2.
          • Tham số URL, POST Data, và Headers.
        • Sử dụng công cụ bổ sung như Wireshark hoặc sandbox để phân tích hành vi runtime.


        Kết thúc Lab07-02.exe

        إرسال تعليق

        Cookie Consent
        We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
        Oops!
        It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
        AdBlock Detected!
        We have detected that you are using adblocking plugin in your browser.
        The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
        Site is Blocked
        Sorry! This site is not available in your country.