Notification texts go here Contact Us Buy Now!

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

Practical Malware Analysis

CHAPTER 6 - RECOGNIZING CODE CONTRUCTSIN ASEMBLY

Write up Lab6-1


Lab 6-1
In this lab, you will analyze the malware found in the file Lab06-01.exe.
Questions
1. What is the major construct code found in the only subroutine called by main?
2. What is the subroutine located at 0x40105F?
3. What is the purpose of this program?
Lab 6-1
Trong lab này, bạn sẽ phân tích mã độc được tìm thấy trong tệp Lab06-01.exe.
Câu hỏi
1. Mã cấu trúc chính được tìm thấy trong chương trình con duy nhất được gọi bởi main là gì?
2. Chương trình con ở 0x40105F là gì?
3. Mục đích của chương trình này là gì?

1. What is the major construct code found in the only subroutine called by main?

(Mã cấu trúc chính được tìm thấy trong chương trình con duy nhất được gọi bởi main là gì?) 

Đầu tiên, chúng ta hãy phân tích tĩnh nhanh tệp thực thi này bằng các kỹ thuật cơ bản.

Hãy xem tệp này có bị pack không với Exeinfor.

Từ Exeinfor cho biết tệp này không bị pack và được viết bằng ngôn ngữ Microsoft Virsual C++.

Tiếp theo xem các hàm được Import với công cụ PPEE (có rất nhiều công cụ như PE-bear, PeStudio, PPEEPE ExplorerDependency Walker, ...).


Từ hình ảnh trên cho thấy trong hàm Import có hai  thư viện liên kết động WININET.dll và KERNEL32.dll. Trong WININET.dll có chức năng đặc biệt được quan tâm là hàm InternetGetConnectState.

Tham khảo về InternetGetConnectState tại đây:


Như vậy hàm này có chức năng truy xuất trạng thái kết nối của hệ thống cục bộ.
Hàm này chủ yếu sẽ có một số tùy chọn tham số và kết quả trả về như ảnh ở dưới.


Đến đây chúng ta đã biết được chức năng của hàm này là gì rồi.

Chúng tôi cũng phát hiện ra chức năng ít phổ biến hơn này GetACP, GetCPinfo trong KERNEL32.dll.



Kế tiếp kiểm tra Strings xem có gì đáng chú ý hay không.



Có rất nhiều ký tự ASCII vô nghĩa, ở 2 hình trên mình đã lọc ra những ký tự có nghĩa, đáng chú ý như:
  • GetACP - Lấy mã hóa trang mã của hệ thống hiện tại.
  • GetCPinfo - Nhận thông tin về trang mã được chỉ định.
  • GetCommandLineA - Lấy tham số đầu vào.
  • Error 1.1: No Internet - Lỗi 1.1: Không có Internet.
  • Success: Internet Connection - Thành công: Kết nối Internet.

Tiếp theo ta sẽ chuyển đến IDAPro để phân tích.

Hãy bắt đầu từ hàm main, nó có địa chỉ sub_401000.


Nhấn 'space' để xem chế độ graph.

Trong hàm main này có thể thấy có chương trình con được gọi là call sub_401000 (khung đỏ). Để xem chi tiết tham chiếu chéo của hàm sub_401000 double click vào hàm đó, IDA sẽ chuyển đến chi tiết hàm.

Nhấn phím 'space' để xem chế độ graph của hàm main.


Xem với chế độ lưu đồ View → Graphs → Flow chart


Chúng ta thấy rằng có một câu lệnh so sánh cmp trước câu lệnh nhảy jz và bằng cách sử dụng chế độ xem biểu đồ, chúng ta có thể xác minh rằng đây là biểu thị của cấu trúc mã 'if'.

2. What is the subroutine located at 0x40105F?
(Chương trình con ở 0x40105F là gì?)

Một cách là tìm các tham số được đẩy lên ngăn xếp trước khi gọi chương trình con. Ở cả hai nơi, một chuỗi định dạng được đẩy lên ngăn xếp và cuối chuỗi là ký tự dòng mới \n.


Nhấn phím 'Space' để chuyển sang chế độ text view.

 
Hãy phân tích chương trình 0x40105F này.
sub_40105F proc near

arg_0= dword ptr  4
arg_4= dword ptr  8

push    ebx ; Đừng lo lắng về điều này hay điều sau.
push    esi
mov     esi, offset File
push    edi
push    esi
call    __stbuf ; Tham số đầu vào của __stbuf là tham số cuối cùng được đẩy vào
                 ; Tức là phần mô tả tập tin ở trên
                 ; Nếu tham số đầu vào là stdout thì đầu ra là đầu ra tiêu chuẩn.
                 ; Bạn có nhớ hàm _stbuf ở trên không?
mov     edi, eax
lea     eax, [esp+10h+arg_4]
push    eax             ; int
push    [esp+14h+arg_0] ; int
push    esi             ; File
call    sub_401282 ; Bạn có nhớ lệnh gọi hàm bên ngoài ở trên không?
push    esi
push    edi
mov     ebx, eax
call    __ftbuf ; Bạn có nhớ hàm _ftbuf ở trên không?
add     esp, 18h
mov     eax, ebx
pop     edi
pop     esi
pop     ebx
retn
sub_40105F endp
Nhưng đầu vào ở đây là offset File chứ không phải printf triển khai nội bộ như vậy. Sau stdout đó, chúng tôi kiểm tra bộ mô tả tệp trong tập hợp này.


Hãy sao chép đoạn này.
FILE <0, 0, 0, 2, 1, 0, 0, 0>

Và điều này có nghĩa là gì, vì Windows là hệ điều hành nguồn đóng nên tôi đã tìm kiếm trên Google rất lâu mà không tìm thấy cấu trúc của phần mô tả tệp Windows.

Tôi chỉ tìm thấy mô tả trên một trang web học ngôn ngữ C, giống như thế này:
typedef struct 
{
 short level ;           1
 short token ;           2
 short bsize ;           3
 char fd ;               4
 unsigned flags ;        5
 unsigned char hold ;    6
 unsigned char *buffer ; 7
 unsigned char * curp ;  8
 unsigned istemp;        9
}F
Cái này có 9 mục, nhưng ở trong IDA sao chép từ nó là 8:
      1  2  3  4  5  6  7  8
FILE <0, 0, 0, 2, 1, 0, 0, 0>
Phiên bản này sai, chúng tôi tiếp tục tìm kiếm và cuối cùng đã tìm thấy định nghĩa này trong mã mingw trên github tại đây

Rồi quay lại tiếp tục so sánh:
struct _iobuf {
    char *_ptr;      // -> 0
    int _cnt;        // -> 0
    char *_base;     // -> 0
    int _flag;       // -> 2
    int _file;       // -> 1
    int _charbuf;    // -> 0
    int _bufsiz;     // -> 0
    char *_tmpfname; // -> 0
};
typedef struct _iobuf FILE;

Vậy là dễ hiểu hơn rồi đó.

Bạn có thể sử dụng mọi thứ khác ở đây mà không cần nhìn vào nó. Chủ yếu chúng ta hãy nhìn vào cái này _file.

Đây là số lượng tệp đang mở trong hệ thống. Nói chung, số lượng thẻ điều khiển (tức là bộ mô tả tệp) được mở khi chúng ta lập trình là tương đối lớn, vì bản thân hệ thống đã mở nhiều tệp hơn.

Tuy nhiên, nhìn chung có ba bộ mô tả tệp được mã hóa cứng và tương đối nhỏ, đó là stdin, stdout, stderr.
Giá trị tương ứng trong hệ thống là:
stdin  -> 0
stdout -> 1
stderr -> 2
Sau khi viết dài dòng thì cuối cùng chúng ta có thể tìm ra bộ mô tả tập tin này làm gì. Bộ mô tả tập tin này trỏ đến stdout, nói chung nó đại diện cho màn hình trên máy tính.

Vì vậy, dựa trên việc triển khai nội bộ của hàm được đăng trước đó printf và so sánh mã hợp ngữ, cuối cùng chúng ta thấy rằng bộ mô tả tệp là stdout, và về cơ bản chúng ta có thể xác định rằng hàm này là printf.

3. What is the purpose of this program?
(Mục đích của chương trình này là gì?)

Mục đích của chương trình này là sử dụng hàm InternetGetConnectedState kiểm tra trạng thái kết internet và sử dụng lệnh print để in ra màn kết quả tương ứng.
  • Nếu biến trả về true, nó sẽ in chuỗi Success: Internet Connection.
  • Nếu không, nó sẽ in ra chuỗi Error 1.1: No Internet.

Kết thúc Lab06-01.exe

Đăng nhận xét

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.