Các kỹ thuật phân tích tĩnh cơ bản (Phần 1)
Trong bài viết này, tôi sẽ trình bày cho các bạn các kĩ thuật phân tích tĩnh cơ bản. Các kĩ thuật này không đòi hỏi quá chuyên sâu về mặt công nghệ, chúng ta chỉ cần kết hợp một số công cụ đã trình bày ở phần 1 – Nguyên lý và kỹ thuật phân tích mã độc, kết hợp chúng với nhau trong các bước để ...
Trong bài viết này, tôi sẽ trình bày cho các bạn các kĩ thuật phân tích tĩnh cơ bản. Các kĩ thuật này không đòi hỏi quá chuyên sâu về mặt công nghệ, chúng ta chỉ cần kết hợp một số công cụ đã trình bày ở phần 1 – Nguyên lý và kỹ thuật phân tích mã độc, kết hợp chúng với nhau trong các bước để thu được kết quả tốt nhất.
AV Scanner
Trước tiên, chúng ta cần kiểm tra xem file nghi ngờ có phải là 1 mã độc đã được các antivirus phát hiện rồi hay không. Ở bước này, chúng ta tiến hành quét file nghi ngờ với nhiều chương trình antivirus nhất có thể.
Nếu bạn đã thiết lập hệ thống các máy ảo có cài đặt các chương trình antivirus, bạn có thể đưa file nghi ngờ vào hệ thống để tiến hành quét, một số antivirus tôi thường sử dụng:
- Kaspersky
- AVG
- AVAST
- Bitdefender
Tuy nhiên, tôi thường chọn các giải pháp Online, lựa chọn đầu tiên tôi nghĩ tới là virustotal online và hoàn toàn miễn phí (tất nhiên họ sẽ thu thập được mẫu mã độc mà bạn upload lên).
Ưu điểm của việc sử dụng các antivirus sẽ giúp chúng ta nhanh chóng xác định được mẫu file nghi ngờ đã từng bị phát hiện hay chưa.
Trong trường hợp không phát hiện mã độc qua các công cụ trên sẽ xảy ra hai khả năng.
- Khả năng đầu tiên là mẫu bạn đang phân tích thực sự là 1 file thông thường.
- Khả năng thứ hai, mẫu bạn đang phân tích thực sự là một mã độc “KHỦNG” vì nó là một mẫu mới hoặc nó đã qua mặt được các antivirus và hệ thống phân tích online.
Tùy theo nhu cầu công việc và yêu cầu của nhiệm vụ phân tích mà ta có thể ra quyết định phân tích tiếp hay không.
XEM THÊM: Muốn bảo mật tài khoản của mình một cách tốt nhất hãy bật ngay tính năng “Bảo mật nâng cao” của Google nhé.
Sử dụng mã băm đặc trưng để tìm kiếm, phân loại mã độc
Trong trường hợp bạn không muốn upload mẫu của mình lên một hệ thống online hoặc đưa mẫu cho những nhà phân tích khác, bạn có thể sử dụng phương pháp này.
PowerShell trên Windows (Có thể cài đặt trên Windows 7, Mặc định trên các phiên bản lớn hơn) có sẵn chương trình certUtil hỗ trợ bạn có thể lấy mã băm của các file. Ngoài ra bạn có thể sử dụng một số công cụ khác: md5deep, FCIV, https://md5file.com/calculator…
Với mã băm thu được, ta có thể sử dụng cho nhiều mục đích khác nhau:
- Gán nhãn, đánh dấu một biến thể mã độc, trạng thái file sạch…
- Chia sẻ cho các chuyên gia, người dùng khác để họ hỗ trợ phát hiện hoặc đề phòng mã độc.
- Upload lên các trang web online (VirusTotal) để xác định xem có loại mã độc nào tương tự hay chưa.
Tìm kiếm các chuỗi String nghi ngờ
Một chương trình thông thường sẽ bao gồm rất nhiều chuỗi (string), sử dụng để thực hiện in các thông báo, cảnh báo, hiển thị thông tin, cũng có thể là địa chỉ IP hoặc tên miền máy chủ mà phần mềm đó kết nối tới, có thể chứa các địa chỉ email, thông tin đăng nhập, mật khẩu, tài khoản mặc định…
Tìm kiếm các chuỗi có thể là cách đơn giản để dự đoán hành vi của chương trình: Chương trình kết nối tới máy chủ có địa chỉ như thế nào, có các thông báo gì quan trọng, chương trình liên kết hoặc sử dụng các ứng dụng hoặc tài nguyên khác trong hệ thống hay không …
Ví dụ: MalwareTech đã tìm ra killswitch trong biến thể đầu tiên của mã độc tống tiền Wanna Cry là địa chỉ URL được hard-coded trong mã độc này.
Có nhiều công cụ cho phép tìm kiếm các string trong một chương trình:
- Các chương trình xem, chỉnh sửa file nhị phân
- Các trình disassembler, debugger như IDA Pro, OllyDBG
- Các trình xem file PE
- Công cụ Strings trong bộ Sysinternals của Microsoft hoặc BinText của McAfee
Ví dụ: Sử dụng công cụ Strings của Microsoft xem danh sách String của chương trình C:WindowsSystem32cmd.exe
Với nhiều chương trình, có những chuỗi có thông tin ý nghĩa sẽ xuất hiện, hỗ trợ chúng ta hiểu về file cần phân tích rõ hơn. Tuy nhiên, hầu hết các mã độc ngày nay đều sử dụng các kĩ thuật encrypt, obfucate, pack, archieve… các chuỗi có ý nghĩa như địa chỉ IP, tên miền thông thường phải đi qua các hàm giải mã mới lấy được, do đó việc xem các chuỗi không phải lúc nào cũng cho những kết quả như ý muốn.
Các mã độc được Packed (đóng gói) và Obfuscated (làm rối)
Các hacker viết mã độc thường sử dụng kỹ thuật packed và obfuscated để làm cho mã độc khó bị phân tích hơn. Một chương trình được làm rối là một chương trình mà mã nguồn của nó được xáo trộn, làm cho rối rắm, gây khó khăn trong việc phân tích tĩnh. Một chương trình được đóng gói là chương trình đã được nén lại và không thể phân tích tĩnh được. Cả hai kỹ thuật này đều gây ra trở ngại lớn cho việc phân tích tĩnh một mã độc.
Vậy làm sao để có thể phát hiện một chương trình đã bị packed hoặc obfuscated?
Các phần mềm an toàn hầu như luôn chứa rất nhiều chuỗi có ý nghĩa (Con người có thể đọc được). Mã độc nếu đã được pack hoặc obfuscate thường chứa rất ít chuỗi có ý nghĩa. Do đó, nếu tìm kiếm trong một chương trình mà thấy có rất ít chuỗi có ý nghĩa, rất có thể chương trình đó đã được packed hoặc obfuscated, điều này gợi ý nó có thể là một mã độc và ta có thể sẽ mất nhiều công sức hơn là phân tích tĩnh để tìm hiểu nó.
Sử dụng kĩ thuật được packed hoặc obfuscate thường sử dụng các hàm riêng để tái sử dụng ở nhiều nơi, do đó bản thân các mẫu này sẽ có import ít nhất hai hàm LoadLibrary và GetProcAddress để phục vụ cho việc gọi hàm.
Đóng gói các files
Việc đóng gói bắt nguồn từ mục đích giảm kích thước file, làm cho việc tải file nhanh hơn. Nhà phát triển phần mềm thường pack các file nhằm gây khó khăn cho các cracker/reverser/hacker trong việc bẻ khóa hoặc dịch ngược mã nguồn. Đối với những nhà phát triển mã độc, packing làm cho quá trình phân tích tĩnh gặp nhiều khó khăn hơn.
Khi một chương trình đã đóng gói được thực thi, bản chất là một đoạn chương trình mồi ban đầu sẽ được thực thi (wrapper) chương trình này sẽ thực hiện giải nén (unpacked) chương trình thật, nạp lên bộ nhớ và chuyển điều khiển về cho chương trình chính. Khi một chương trình đã đóng gói được phân tích tĩnh, thực ra chỉ có wrapper là thứ mà ta có thể mổ xẻ.
Bên trái là file thực thi gốc với tất cả các strings, imports và các thông tin khác đều có thể được tìm thấy. Bên phải là file thực thi đã được đóng gói, tất cả strings, imports và thông tin khác đều được nén lại và không thể bị phát hiện bởi hầu hết các công cụ phân tích tĩnh.
Khi sử dụng, packer nén, mã hóa, lưu hoặc giấu code gốc của chương trình, tự động bổ sung một hoặc nhiều section, sau đó thêm đoạn code Wrapper (Unpacking Stub) và chuyển hướng con trỏ lệnh (Entry Point – EP) tới vùng code này để thực thi. Bình thường, một file không đóng gói (Nonpacked) sẽ được nạp trực tiếp bởi hệ điều hành (OS). Với file đã đóng gói thì Wrapper sẽ được tải bởi OS, sau đó Wrapper sẽ tải chương trình gốc. Lúc này, EP của file thực thi sẽ trỏ tới Wrapper thay vì trỏ vào code gốc.
Phát hiện Packer với PEiD
Một cách để phát hiện file có được đóng gói hay không là sử dụng công cụ PEiD. Ta có thể dùng PEiD để xác định trình đóng gói (packer) hoặc trình biên dịch được sử dụng để xây dựng ứng dụng. Những phát hiện này có thể làm cho việc phân tích các file đã được đóng gói dễ dàng hơn. Một công cụ khác cũng tiện lợi như PEiD là DIE (Detect It Easy).
Một khi chương trình được đóng gói, ta phải giải nén nó (unpack) mới có thể thực hiện bất kì thao tác phân tích tĩnh nào. Thao tác giải nén thường phức tạp và chưa được diễn giải sâu trong phần này.
Một số pulg-in của PEiD sẽ thực thi mã độc mà không có báo trước hay đưa ra cảnh báo (có vẻ một số plug-in của OllyDbg và nhiều công cụ khác cũng vậy). Cũng như tất cả các phầm mềm khác, bản thân PEiD cũng tồn tại những lỗ hổng, chẳng hạn bản 0.92 tồn tại lỗ hổng buffer overflow cho phép hacker thực thi code theo ý muốn. Cách tốt nhất là luôn cảnh giác khi sử dụng, và luôn sử dụng phiên bản phần mềm mới nhất.
Định dạng PE file
Thường thì các công cụ có thể quét các file thực thi mà không quan tâm định dạng của chúng. Nhưng việc biết được một file thuộc định dạng nào có thể cung cấp nhiều thông tin hữu ích về các chức năng của file thực thi đó.
PE (Portable Executable) là định dạng được sử dụng bởi các file thực thi, đối tượng code hoặc các DLL trong Windows. Định dạng PE là một cấu trúc dữ liệu chứa các thông tin cần thiết để hệ điều hành quản lý các mã thực thi. Gần như tất cả các file có mã thực thi được hệ điều hành Windows tải đều là các file định dạng PE. Tất nhiên, một số định dạng khác vẫn được phát hiện trong một số ít mã độc.
Các file PE bắt đầu bằng một header chứa thông tin về mã nguồn, loại phần mềm, các hàm thư viện cần thiết, không gian cần thiết,… Các thông tin này là rất giá trị đối với việc phân tích mã độc.
XEM NHIỀU NHẤT: 6 cách để giảm chi phí TCO hiệu quả thông qua quản lý vòng đời của PC.
Theo chuyên gia an ninh mạng Bùi Đình Cường.
SECURITYBOX đơn vị an ninh mạng số 1 Việt Nam nơi cung cấp các thiết bị, dịch vụ đánh giá an ninh mạng cho Doanh nghiệp của bạn được bảo vệ một cách an toàn nhất trước sự tấn công của các Hacker.
Thông tin liên hệ:
Công ty cổ phần An toàn thông tin MVS – SecurityBox
Địa chỉ: Tầng 9, Tòa nhà Bạch Dương, Số 459 Đội Cấn, Ba Đình, Hà Nội
Hotline: 098 6464 517 (Mr. Minh)
Email: info@securitybox.vn