Phân tích tĩnh đơn giản là quá trình phân tích mã độc mà không cần thực thi. Trong giai đoạn này chúng ta sẽ thu thập thông tin quan trọng về mã độc và sử dụng những thông tin này phục vụ cho việc phân tích động ở giai đoạn sau.
Cần phân tích những gì?
Khi thực hiện phân tích tĩnh, ta cần làm rõ được một số thông tin:
- Đây là loại file gì?
- Mã độc này đã được phát hiện bởi cộng đồng trước đó hay chưa?
- Những chuỗi kí tự được nhúng trong mã độc này nói lên điều gì?
- PE Header có gì đặc biệt hay không?
- Mã độc này có được pack không? Nếu có thì sử dụng packer gì?
Tài nguyên
Các bạn có thể tải file mã độc mẫu ở . Mật khẩu giải nén là “infected“. Lưu ý, đây là mã độc thật, do đó các bạn cần thực hiện phân tích trên máy ảo để card mạng chế độ Host-Only và không share bất kỳ thư mục vào với máy chính.
Các bước phân tích mã độc bằng phân tích tĩnh
Xác định loại file thực thi
Đôi khi attacker sẽ thay đổi định dạng của file mã độc sang một đuôi khác để đánh lừa người dùng. Do đó để xác định chính xác mã độc đó là loại file thực thi nào, ta có thể sử dụng một số dấu hiệu như:
- Windows Executables: có “MZ” ở byte 0-1.
- PDF: có chứa chuỗi “%PDF-“ theo sau là một con số, số này là phiên bản của PDF, dùng con số này để xác định phần mềm đọc file PDF có version tối thiểu là bao nhiêu thì mới có thể đọc được file PDF này. Chuỗi “%PDF-“ này nằm trong vị trí bất kì trong 1024 bytes đầu tiên của file.
- Old Office Doc: 0xD0CF11E0 (doc file)
- Zip Archive: có “PK” ở byte 0-1.
Ta có thể sử dụng một số công cụ sau:
file
Công cụ này các bạn có thể tìm thấy ở đây. Nó xác định bằng cách so sánh header của file với một số signature biết trước.
exeinfo PE
Công cụ exeinfo này có chức năng chính là phân tích PE header, xác định packer, đưa ra gợi ý cách unpack.
TrID
TrID cũng tương tự, nó sử dụng database chứa các pattern rồi so sánh để xác định kiểu file.
Tính toán mã băm
Việc tính toán mã băm sẽ giúp chúng ta xác định được mã độc này đã từng được cộng đồng phát hiện hay phân tích trước đó hay chưa. Nếu có thì sẽ tiết kiệm cho chúng ta rất nhiều thời gian. Ta sẽ sử dụng một số công cụ để tính mã băm MD5, SHA-256, … và tra cứu trên VirusTotal:
Nếu tìm thấy, chứng tỏ đây là một file mã độc không mới và ta có thể khai thác nhiều thông tin hơn từ internet.
Phân tích chuỗi
Bước tiếp theo chúng ta sẽ tiến hành tìm kiếm những chuỗi được nhúng vào cũng như tìm những chuỗi ẩn (hidden string). Một số công cụ có thể giúp ích như:
- strings: công cụ strings có thể phân tích ASCII và Unicode đồng thời. Option
-n
giúp ta chỉ định độ dài chuỗi tối thiểu cần phân tích (mặc định là 3) và-o
sẽ xuất ra decimal offset của chuỗi đó. - BinText: tương tự strings nhưng với độ dài chuỗi tối thiểu cần phân tích mặc định là 5.
Ta sử dụng công cụ strings để phân tích các chuỗi:
strings -o budget-report.exe > string.txt
Sau khi chạy lệnh trên, file string.txt được tạo, ta mở file ra và lần lượt phân tích. Ở các dòng 253 đến 260, mình thấy một số chuỗi đáng ngờ như hình bên dưới. (Chú ý: Số thứ tự dòng của mình có thể khác so với các bạn nên các bạn tự tìm theo kết quả phân tích của bản thân nhé).
Khi ghép lại ta được các từ như Run, RunOnce và chúng liên quan đến Registry. Mã độc thường sử dụng các registry này để đảm bảo chúng được chạy khi reboot lại máy.
Tương tự ở dòng 999, ta có thể thấy được domain update.microsoft.com.
Tại dòng 1023 ta thấy Start Menu\Programs\Startup:
Tiếp theo ta bắt gặp một chuỗi dài không có nghĩa, khả năng cao đây là một chuỗi nào đó đã được mã hóa hoặc encode:
Ta còn thấy một số file name trong Windows, những thông tin này có thể sẽ có ích khi phân tích hành vi của mã độc.
Chuỗi tại dòng 2633 là một chuỗi bảng chữ cái từ viết hoa, viết thường, các chữ số, dấu cộng và dấu (/). Rất có thể mã độc đang thực hiện hành vi liên quan đến mã base64.
Tiếp theo ta thấy một số chuỗi liên quan đến Skype và trình duyệt.
Ở đòng 2733 ta thấy “ws2_32.dll” và một số API. Ws2_32.dll là một tập tin DLL phát triển bởi Microsoft, là hệ thống tập tin thiết yếu của hệ điều hành Windows. Chúng thường chứa một tập hợp thủ tục và các chức năng điều khiển. Tập tin này liên quan đến kết nối mạng, socket, gửi nhận qua mạng. Ta có thể đoán được mã độc này muốn giao tiếp gì đó qua mạng.
Tiếp theo…
Tương tự các bạn tự khám phá những nội dung còn lại.
Để việc phân tích dễ dàng hơn và ta không cần phải chắp nối kết quả bằng tay như bên trên, mình sẽ sử dụng BinText. Mở BinText và import file mã độc vào. Ở cột bên trái mình khoanh bên dưới đó là kiểu string.
Xác định packer và kỹ thuật ẩn giấu chuỗi
Hacker sẽ sử dụng packer để nén chuỗi hoặc mã hóa chuỗi để đánh lừa việc phân tích. Khi ta nhìn vào một chuỗi đã được packed, chúng ta sẽ không thể hiểu được nội dung là gì.
Hacker có thể ẩn giấu chuỗi bằng một số phương pháp như:
- Random strings: packer thêm vào những chuỗi ngẫu nhiên hoặc có ý nghĩa không liên quan để đánh lừa.
- Encrypted strings: chuỗi có thể được mã hóa hoặc encoded.
Kỹ thuật base64 encoding là một kỹ thuật phổ biến, nó chuyển mỗi 3 bytes thành 4 ký tự ASCII. Base64 chỉ chứa những ký tự trong bảng chữ cái, chữ số, dấu cộng (+) và dấu (/). Nếu ta bắt gặp chuỗi nào đó có những ký tự trên thì hãy thử decode base64 xem có thu thập được thông tin gì hay không. Chuỗi base64 được thêm vào dấu bằng (=) để tổng số bytes trong chuỗi là một số chia hết cho 4.
Ta có thể decode base64 bằng Powershell:
doskey atob=powershell
"[Text.Encoding]::UTF8.GetString([convert]::fromBase64String(\"$*\))"
Ngoài ra còn có thể thực hiện bằng phép XOR. Là một phép toán trên bit, kết quả sẽ là 1 nếu hai bit tương ứng có giá trị khác nhau.
Chúng ta sử dụng công cụ xorsearch để tìm các chuỗi được XOR:
Tương tự,
Tương tự các bạn tự tìm thêm.
Phân tích PE header
PE header là gì?
PE header chứa rất nhiều thông tin quan trọng trong việc phân tích mã độc, PE header sẽ giúp ta biết được mã độc tương tác với hệ điều hành như thế nào. Trong này còn có một số trường giúp chúng ta xác định được timestamp và location, tức là ta sẽ biết được mã độc được tạo ở đâu và khi nào.
- Containers: Chứa tất cả thông tin mà Windows cần để thực thi chương trình, nó xác định cần phải load DLL nào, vị trí nào là executable code, vị trí nào là data, chương trình này có hỗ trợ GUI hay không? Nếu không có PE header, chương trình sẽ không thể chạy.
- Director: chỉ cho hệ điều hành biết những phần của code được đặt ở đâu trong bộ nhớ RAM.
Ở hình trên, ta dễ dàng xác định được file này được tạo từ năm 2007. Tuy nhiên, thông tin này chưa hẳn là chính xác bởi vì hacker có thể thay đổi giá trị này dễ dàng để đánh lừa chúng ta.
Hình trên thể hiện chương trình này có hỗ trợ Windows GUI.
PE sections
PE sections dùng để xác định từng phần của file PE. Một số loại section như hình bên dưới:
Import Address Table
Import Address Table (IAT) chứa danh sách những DLL và API được load bởi chương trình khi thực thi.
Ở hình trên, ở bên trái là IAT, chứa DLL (Kernel32.dll) và API (VirtualAlloc, ReadFile, WriteFile) mà chương trình sử dụng. Khi DLL được load, nó sẽ nằm tại một vị trí nào đó trong bộ nhớ RAM mà chương trình không thể biết trước. Ở hình bên phải, khi Kernel32.dll được load vào trong bộ nhớ, mỗi function sẽ nằm tại một địa chỉ xác định, và loader sẽ thay thế tên của API thành địa chỉ của nó.
Ngoài ra, không nhất thiết phải thay thế tên function bằng địa chỉ của nó mà có thể thay thế bằng Ordinals. Thực chất nó chỉ là một số hiệu định danh function ở trong DLL.
Một số API phổ biến:
- Memory Operations: VirtualAlloc, VirtualProtect, VirtualFree
- File Operations: CreateFile, ReadFile, WriteFile, DeleteFile
- Registry Operations: RegCreateKey, RegDeleteKey, RegGetValue, RegSetValueEx, RegSetKeyValue
- Network Operations: connect, accept, send, recv, listen, InternetConnect, InternetReadFile, InternetWriteFile, gethostbyaddr, gethostbyname
- Misc: LoadLibrary, GetProcAddress, IsDebuggerPresent, WriteProcessMemory, CreateThreatProcess
Resources
Resource là raw data, là bất kì thành phần nào cần thiết để chương trình khởi chạy. Ví dụ như icons, hình ảnh, font chữ, menu, … Mã độc có thể lữu trữ những đoạn code ẩn hoặc cấu hình ẩn, hoặc những document giả mạo. Hình sau là một ví dụ về những resource trong một file PE, được phân tích bởi công cụ PE Studio. Ta tìm được một số loại resource khác nhau như MUI, Bitmap, Icon.
Ta có thể phát hiện một số resource đáng ngờ như hình bên dưới. PE Studio không xác định được signature của những resource này.
Một số công cụ ta có thể sử dụng để phân tích PE header như CFF Explorer và PE Studio.
Đầu tiên chúng ta cài đặt PE Studio, mở file mã độc phía trên lên.
Khi phân tích phần file-header, mục stamp, ta thấy giá trị ngày giờ ở đây là vào tháng 10 năm 1998. Tuy nhiên giá trị này không phải lúc nào cũng chính xác bởi vì hacker có thể thay đổi.
Tiếp tục xem phần optional-header, vào subsystem, ta thấy có giá trị GUI – tức là mã độc này có khả năng tương tác với người dùng thông qua giao diện trực quan.
Tại mục sections, ta thấy có nhiều section như .text, .data, .rdata, .eh_fram, .bss, .idata, …
Tiếp theo ở mục libraries, ta thấy có một số thư viện được PE Studio đưa vào blacklist, tức đây là những thư viện mà malware thường sử dụng. Ở đây có wininet.dll và ws2_32.dll là những thư viện liên quan đến network. Ta có thể đoán được malware có khả năng giao tiếp qua mạng.
Tiếp theo ở mục libraries ta thấy rất nhiều function liên quan đến registry. Một số hàm như RegCreateKeyExA, RegDeleteValueA, RegSetValueExA, … chứng tỏ malware có khả năng tương tác với registry.
Ngoài ra ta còn tìm thấy hàm CopyFile và CreatDirectory, GetProcAddress, LoadLibraryA, LoadLibraryW, WriteFile, ShellExecuteA, …
Về resource, malware sử dụng rất nhiều resource có signature là Adobe Reader. Language là English United States, chứng tỏ malware được compile trên một máy tính có ngôn ngữ là tiếng anh (hoặc có thể là hacker chỉnh sửa).
Ở mục indicators, công cụ PE Studio có thể đánh giá được hành vi của malware, như xác định malware này có thể thay đổi registry, thao tác với clipboard, fingerprint trình duyệt, … Giá trị severity càng thấp thì mức độ nguy hiểm càng cao.
Tại strings, ta tìm thấy rất nhiều string được đánh dấu blacklisted.
Với công cụ CFF Explorer, thông tin phân tích được sẽ không được convert và đa số ở dạng raw information.
Kết luận
Sau khi phân tích ví dụ, ta có thể kết luận được một số đặc điểm:
- Được compile vào năm 1988
- Không bị packed:
- Normal looking sections
- IAT normal size
- Chức năng:
- Thay đổi registry
- Ghi file hệ thống
- Giao tiếp thông qua kết nối mạng
- Thực thi chương trình
- Từ một máy tính “US”
Comments 1