18/09/2018, 15:22

Phân Tích Mã Độc Sử Dụng IDA PRO (Phần 2)

Tiếp tục chủ đề phân tích mã độc sử dụng IDA PRO trong bài viết này chuyên gia an ninh mạng Bùi Đình Cường sẽ gửi đến các bạn những vấn đề thường xuyên gặp phải khi tiến hành phân tích mã độc sử dụng IDA PRO Phân tích hàm Một trong các chức năng mạnh mẽ nhất của IDA Pro là ...

phân tích hàm

Tiếp tục chủ đề phân tích mã độc sử dụng IDA PRO trong bài viết này chuyên gia an ninh mạng Bùi Đình Cường sẽ gửi đến các bạn những vấn đề thường xuyên gặp phải khi tiến hành phân tích mã độc sử dụng IDA PRO

Phân tích hàm

Một trong các chức năng mạnh mẽ nhất của IDA Pro là khả năng ghi nhận các hàm, gán nhãn cho chúng và tìm ra các biến cục bộ cũng như các tham số. Hình dưới đây minh họa một hàm được ghi nhận bởi IDA Pro.

phân tích hàm

Chú ý cách IDA Pro thông báo rằng đây là một EBP-based stack frame được dùng trong hàm (1), điều này có nghĩa các biến cục bộ và các tham số sẽ được tham chiếu thông qua thanh ghi EBP trong toàn bộ hàm. IDA Pro đã phát hiện được tất cả các biến cục bộ và tham số trong hàm này. Chúng được gán nhãn theo quy tắc: các biến cục bộ được gán tiền tố var_, các tham số được gán tiền tố arg_, và đặt tên bằng một hậu tố tương ứng với offset của chúng dựa trên EBP. IDA Pro chỉ gán nhãn các biến cục bộ và tham số được sử dụng trong code và không có cách nào để ta nhận biết một cách tự động để nó tìm thấy mọi thứ từ mã nguồn gốc.

Như đã đề cập trong chương x86 Disassembly, các biến cục bộ sẽ ở vị trí âm so với EBP và các tham số thì ở các offset dương với EBP. Ta có thể thấy tại (2), IDA Pro tóm lược phần gốc stack với dòng đầu tiên là chuỗi Str tương ứng với giá trị 0x318, hay biến cục bộ var_8 có giá trị 8. IDA Pro cho ta biết chuỗi Str và biến var_8 được sử dụng như thế nào tại (3)(4).

Đôi khi IDA Pro không thể xác định được một hàm. Nếu trường hợp này xảy ra, ta có thể tạo một hàm bằng cách nhấn phím P. Nó cũng có thể không xác định được EBP-based stack frame và các biến cục bộ cũng có thể xuất hiện mà không được gán nhãn. Trong hầu hết trường hợp, ta có thể khắc phục bằng cách nhấn tổ hợp phím ALT+P, chọn BP Based Frame và chỉ định 4 bytes for Saved Registers.

XEM: Phần 1 Phân Tích Mã Độc Sử Dụng IDA PRO 

Sử dụng các tùy chọn biểu đồ

IDA Pro cung cấp 5 tùy chọn biểu đồ, truy cập qua các nút trên Toolbar như trong hình bên. 4 trong số 5 tùy chọn này sử dụng các tham chiếu chéo.

Khi click vào một trong các nút trên, IDA Pro sẽ trình bày một biểu đồ thông qua một ứng dụng tên là WinGraph32. Không giống như biểu đồ mà ta thấy trong cửa sổ IDA View, các biểu đồ này không được quản lý bởi IDA (Chúng thường được gọi là các biểu đồ kế thừa). Các tùy chọn biểu đồ trên được mô tả cụ thể như sau:

Nút Chức năng Mô tả
 nút 1 Tạo một biểu đồ luồng cho hàm hiện tại Người dùng sẽ ưu tiên dùng biểu đồ tương tác trong cửa sổ IDA View nhưng có thể dùng nút này mỗi khi muốn dùng một biểu đồ thay thế. (Ta sẽ giải thích rõ hơn về tùy chọn này ở chương sau.)
 nút 2 Tạo biểu đồ cho các lời gọi hàm trong toàn bộ chương trình Dùng tùy chọn này để nhanh chóng hiểu thứ bậc của các lời gọi hàm trong chương trình, như trong hình graph_xref_program phía dưới. Để tìm hiểu sâu hơn, sử dụng tính năng zoom của WinGraph32. Ta sẽ thấy biểu đồ của các file thực thi liên kết tĩnh lớn có thể trở nên lộn xộn đến mức không thể sử dụng được.
 nút 3 Tạo biểu đồ cho các tham chiếu chéo đến tham chiếu chéo đang được chọn Tùy chọn này hữu ích để tiếp cận một đối tượng cụ thể. Nó cũng hữu ích đối với các hàm vì có thể giúp ta tìm các đường dẫn khác nhau mà một chương trình có thể có để gọi một hàm cụ thể.
 nút 4 Tạo biểu đồ cho các tham chiếu chéo từ biểu tượng đang được chọn Là cách tốt để xem một loạt các lời gọi hàm. Ví dụ, hình graph_xref_singlefunction bên dưới thể hiện biểu đồ dạng này cho một hàm đơn. Chú ý cách mà hàm sub_401E9E gọi hàm sub_401000, sau đó sub_401000 lại gọi fopen. Biểu đồ này chỉ ra những gì mà một hàm thực hiện và những hàm dưới nó thực hiện những gì. Đây là cách dễ nhất để khái quát hóa các hàm.
 nút 5 Tạo biểu đồ tham chiếu chéo theo chỉ định của người dùng Dùng tùy chọn này để xây dựng một biểu đồ tùy biến. Ta có thể chỉ định độ sâu đệ quy, các đối tượng được dùng, các đối tượng “to” hay “from” và các dạng node muốn loại trừ của biểu đồ. Đây là cách duy nhất để tùy biến biểu đồ sinh bởi IDA Pro để hiển thị trong WinGraph32.
graph_xref_program

graph_xref_program

graph_xref_singlefunction

graph_xref_singlefunction

Nâng cao hiệu quả dịch ngược

Một trong các tính năng tốt nhất của IDA Pro là cho phép người dùng tùy chỉnh quá trình dịch ngược để phù hợp với mục đích riêng. Các thay đổi mà ta tạo có thể tăng tốc độ và hiệu quả phân tích mã độc một cách đáng ngạc nhiên!

Lưu ý: IDA Pro không có tính năng undo, vì thế hãy thật cẩn thận khi tạo bất kì một thay đổi nào.

Đổi tên vùng nhớ

IDA Pro làm rất tốt trong việc tự động đổi tên địa chỉ nhớ ảo và các biến stack, nhưng ta cũng có thể sửa đổi các tên này bằng tên có nghĩa hơn. Các tên được sinh tự động (còn gọi là tên giả – dummy name) chẳng hạn như sub_401000 không khơi gợi cho ta được gì nhiều; một hàm với tên ReverseBackdoorThread sẽ hữu ích hơn nhiều. Việc đổi một tên có nghĩa còn giúp ta chắc chắn rằng mình dịch ngược một hàm không quá một lần. Khi đổi các tên giả, ta cần thực hiện trên chỉ một vị trí, IDA Pro sẽ áp dụng tên mới tại tất cả các vị trí còn lại của đối tượng.

Sau khi đổi một tên giả thành một tên khác ý nghĩa hơn, các tham chiếu chéo cũng trở nên dễ phân tích hơn. Ví dụ, nếu một hàm sub_401200 được gọi nhiều lần trong suốt chương trình và ta đổi tên nó thành DNSrequest, nó sẽ được đổi tên thành DNSrequest trong toàn bộ chương trình. Tưởng tượng ta có thể tiết kiệm bao nhiêu thời gian để phân tích khi có thể đọc những cái tên có nghĩa thay vì phải dịch ngược hàm thêm một lần nữa hoặc phải nhớ những gì mà sub_401200 thực hiện.

Để đổi tên một đối tượng, đơn giản chỉ cần đưa con trỏ chuột vào đối tượng và nhấn phím N hoặc click chuột phải, chọn Rename.

Chú thích

IDA Pro cho phép ta chèn chú thích thủ công và tự động.

Để tự thêm chú thích của mình, đưa con trỏ chuột đến dòng code và nhấn nút hai chấm trên bàn phím (: hay Shift + ;) để gọi cửa sổ chú thích. Để chèn chú thích lặp lại, lặp lại ở bất cứ đâu có tham chiếu chéo đến địa chỉ mà ta chèn chú thích, nhấn phím chấm phẩy (;) trên bàn phím.

Định dạng các toán hạng

Khi dịch ngược, IDA Pro đưa ra các quyết định về cách định dạng các toán hạng cho từng lệnh. Dữ liệu thường được hiển thị dưới định dạng các giá trị Hex. IDA Pro cho phép ta thay đổi các dữ liệu này nếu cần để khiến chúng dễ hiểu hơn.

Hình bên dưới minh họa một ví dụ sửa đổi các toán hạng trong một lệnh, khi giá trị 0FFFFFFFFh được so sánh với giá trị của thanh ghi EAX. Nếu click chuột phải vào giá trị 0FFFFFFFFh, ta có thể lựa chọn thay đổi giá trị 0FFFFFFFFh thành 4294967295 trong định dạng thập phân, 37777777777 trong định dạng octal hay 11111111111111111111111111111111 ở định dạng nhị phân – bất kỳ định dạng nào phù hợp với nhu cầu và tình hình của mình.

aaaaaas

Để chỉ định một toán hạng tham chiếu đến địa chỉ nhớ hay chỉ như dữ liệu bình thường, nhấn phím O trên bàn phím. Ví dụ, giả sử khi đang phân tích một liên kết tới loc_410000, ta truy ra liên kết ngược và thấy lệnh sau:

—————————————————————————————————————————-

mov eax, loc_410000

add ebx, eax

mul ebx

—————————————————————————————————————————-

Ở mức hợp ngữ, mọi thứ là các số, nhưng IDA Pro đã nhầm số 4259840 (giá trị thập phân của 0x410000) thành một tham chiếu đến địa chỉ 410000. Để sửa lỗi sai này, nhấn phím O để thay đổi địa chỉ thành số 410000h và xóa tham chiếu chéo không đúng.

Sử dụng các hằng được đặt tên

Lập trình viên (và tác giả mã độc) thường sử dụng các hằng được đặt tên chẳng hạn như GETPHYSPAGESIZE trong mã nguồn của mình.

IDA Pro cung cấp một danh sách các hằng đặt tên cho Windows API và thư viện C chuẩn và ta có thể sử dụng tùy chọn Use Standard Symbolic Constant từ một toán hạng trong lệnh hợp ngữ. Hình dưới minh họa cửa sổ hiện lên khi chọn Use Standard Symbolic Constant đối với giá trị 0FFFFFFFFh.

các hằng được đặt tên

Đoạn code phía dưới thể hiện kết quả của việc áp dụng các hằng tượng trưng chuẩn cho lời gọi Windows API đến hàm CreateFileA.

Để xác định giá trị nào nên sử dụng hằng đặt tên trong cửa sổ hằng tượng trưng chuẩn, ta cần tham khảo danh sách các lời gọi API trên trang MSDN của Microsoft, ta sẽ đề cập sâu hơn tại chương 7 khi nghiên cứu về các khái niệm trong Windows.

Đôi khi một hằng tượng trưng chuẩn mà ta muốn sẽ không xuất hiện và ta sẽ cần tải thư viện thích hợp một cách thủ công. Chọn View > Open Subviews > Type Libraries để xem các thư viện đã được tải. Thường thì mssdk vc6win sẽ được tải tự động, nhưng nếu không thì ta có thể tải chúng theo cách thủ công (Các mã độc sử dụng Native API hay Windows NT family API thường sẽ cần đến hai thư viện này). Để có các hằng tượng trưng cho Native API, hãy tải ntapi (Microsoft Windows NT 4.0 Native API). Tương tự, khi phân tích một file nhị phân Linux, ta có thể cần phải tải thư viện gnuunx (GNU C++ UNIX) một cách thủ công.

Trước khi áp dụng các hằng tượng trưng Sau khi áp dụng các hằng tượng trưng
 cột trái  cột phải

Tái định nghĩa Code và Dữ liệu

Khi IDA Pro thực hiện thủ tục ban đầu của quá trình dịch ngược một chương trình, các byte thỉnh thoảng được phân loại không chính xác; code có thể được định nghĩa như là dữ liệu và ngược lại. Cách phổ biến nhất để tái định nghĩa code trong cửa sổ IDA View là nhấn phím U để hủy định nghĩa hàm, code hay dữ liệu. Khi hủy định nghĩa code, các byte sẽ được định dạng lại như một danh sách các byte thô (raw bytes).

yes no

Để định nghĩa các byte thô là code, nhấn phím C. Ví dụ, bảng phía dưới thể hiện một tài liệu PDF độchại có tên paycuts.pdf. Tại offset 0x8387, ta phát hiện shellcode (được định nghĩa là các byte thô) tại (1), ta nhấn phím C trên vùng đó. Shellcode được dịch ngược và ta thấy nó chứa một vòng lặp giải mã XOR với 0x97 tại (2).

Tùy thuộc vào mục đích cụ thể, ta có thể định nghĩa các byte thô là dữ liệu hay các chuỗi ASCII bằng cách nhấn phím D hoặc A.

File trước khi nhấn C File sau khi nhấn C
 cột trái 1 cột phải 1

Mở rộng IDA với các Plug-in

Ta có thể mở rộng chức năng của IDA Pro bằng nhiều cách, thường là thông qua các script. Tiềm năng từ các script là vô hạn và mục đích đa dạng từ việc đánh dấu code đơn giản đến các chức năng phức tạp như so sánh giữa các file cơ sở dữ liệu của IDA.

Ở đây, ta sẽ nghiên cứu hai cách phổ biến nhất để sử dụng script: các script IDS Python. Các script IDC và Python có thể được chạy dể dàng bằng cách chọn File > Script file…. Cửa sổ output phía dưới workspace cho phép theo dõi log dùng bởi plug-in để debug hoặc thông báo trạng thái.

Sử dụng các IDC Script

IDA Pro sử dụng một ngôn ngữ kịch bản (script) tích hợp sẵn là IDC, được biết đến trước sự bùng nổ của các ngôn ngữ kịch bản phổ biến như Python hay Ruby. Thư mục con IDC bên trong thư mục cài đặt IDA chứa một số mẫu script IDC mà IDA Pro sử dụng để phân tích code dịch ngược.

Các script IDC là những chương trình xây dựng từ các hàm, với tất cả các hàm được khai báo tĩnh. Các đối số không cần phải được chỉ định kiểu và auto được dùng để định nghĩa các biến cục bộ. IDC có rất nhiều hàm tích hợp sẵn, như được mô tả trong chỉ mục help của IDA Pro hoặc file idc.idc.

Trong chương 1, ta đã đề cập đến công cụ PEiD và plug-in Krypto ANALyzer (KANAL) có thể trích xuất một IDC script. IDC script tạo các dấu trang và chú thích trong cơ sở dữ liệu của IDA Pro đối với một file nhị phân cho trước như trong đoạn code bên dưới.

icd

Để tải một IDC script, chọn File > Script file…. IDC script sẽ thực thi tức thì và một cửa sổ toolbar sẽ được mở với một nút để chỉnh sửa và một nút để thực thi lại script nếu cần.

Sử dụng IDAPython

IDAPython được tích hợp đầy đủ vào phiên bản hiện tại của IDA Pro, mang lại sức mạnh và sự thuận tiện của các script Python trong phân tích nhị phân. IDAPython có 3 module cung cấp khả năng truy cập tới IDA API (idaapi), giao diện IDC (idc) và các hàm IDAPython utility (idautils).

Các script IDAPython là các chương trình sử dụng một effective address (EA) để thực hiện các phương thức sơ cấp về tham chiếu. Không có kiểu dữ liệu trừu tượng và hầu hết các lời gọi hàm sử dụng hoặc là một EA hoặc là một chuỗi tên tượng trưng (symbol name string). IDAPython có nhiều hàm wrapper xung quanh các hàm IDC lõi.

Hình bên dưới thể hiện một script IDAPython mẫu. Mục đích của script này là gán màu tất cả các lệnh call trong một idb để khiến chúng nổi bật hơn cho dễ phân tích. Ví dụ, ScreenEA là một hàm phổ biến để lấy vị trí của con trỏ chuột. Head là một hàm được dùng để rà soát tất cả các thành phần đã được định nghĩa, trong trường hợp này là các lệnh. Một khi đã thu thập tất các các lời gọi hàm trong functionCalls, ta tương tác qua các lệnh đó và sử dụng SetColor để gán màu.

—————————————————————————————————————————-

from idautils import *

from idc import *

heads = Heads(SegStart(ScreenEA()), SegEnd(ScreenEA()))

functionCalls = []

for i in heads:

if GetMnem(i) == “call”:

functionCalls.append(i)

print “Number of calls found: %d” % (len(functionCalls))

for i in functionCalls:

SetColor(i, CIC_ITEM, 0x7fdff)

—————————————————————————————————————————-

Sử dụng các Plug-in thương mại

Khi đã có kinh nghiệm với IDA Pro, ta nên cân nhắc mua một số plug-in thương mại như Hex-Rays Decompiler và zynamics BinDiff. Hex-Rays Decomplier là một plug-in rất hữu ích để chuyển code ASM của IDA Pro thành dạng người đọc được hoặc giả code C. Đọc code kiểu C thay vì đọc code ASM có thể tăng tốc độ phân tích vì plug-in này cho phép ta đọc mã nguồn gần giống với code mà tác giả mã độc đã viết.

Zynamics BinDiff là một công cụ mạnh mẽ giúp so sánh hai cơ sở dữ liệu IDA Pro. Nó cho phép ta tìm điểm khác nhau giữa hai biến thể mã độc, bao gồm các hàm mới và các điểm khác nhau trong những hàm có tương tự nhau.

XEM NHIỀU NHẤT: Dấu hiệu nhận biết mã độc và phương pháp phòng tránh

Theo chuyên gia an ninh mạn: Bùi Đình Cường

0