Biểu dé luồng điều khiển - Control flow graph

Một phần của tài liệu Khóa luận tốt nghiệp An toàn thông tin: Phương pháp phát hiện sự tương đồng mã nhị phân của chương trình dựa trên học sâu trong an toàn phần mềm (Trang 21 - 26)

CHƯƠNG 2. CƠ SỞ LÝ THUYET

2.1. Các thành phần liên quan đến tập tin nhị phân

2.1.3. Biểu dé luồng điều khiển - Control flow graph

Control Flow Graph (CFG) là một biểu đồ đại diện cho cấu trúc điều khiển của một chương trình máy tính. Nó biểu thị các luồng thực thi của chương trình

từ các câu lệnh và điều kiện điều khiển. CFG được sử dung trong phân tích và kiểm tra mã nguồn để hiểu cấu trúc logic của chương trình.

Trong một CFG, các câu lệnh trong chương trình được biểu diễn dưới dạng

các nút (nodes), trong đó mỗi nút đại điện cho một câu lệnh hoặc một basic

block. Các nút được kết nối bởi các cạnh (edges), biểu thị các quan hệ luồng đi giữa các nút. Các cạnh có thể được đánh số hoặc gán các nhãn để đại diện cho điều kiện điều khiển (như "if", "else", "while",...).

Trong phát hiện sự tương đồng trong mã nhị phân, CFG được sử dụng để so sánh cấu trúc điều khiển của các chương trình khác nhau và xác định sự tương

đồng giữa chúng. Các phương pháp phát hiện sự tương đồng thường dựa trên việc so sánh các đặc trưng của CFG, quan hệ điều khiển và đường đi thực thi. Thông qua CFG, có thể xác định sự tương đồng giữa các chương trình nhị phân, phát hiện mã độc hoặc nhận diện các mẫu tấn công trong mã nhị phân. CFG cũng cung cấp một cách để phân tích và tối ưu hóa mã nhị phân, giúp tăng hiệu suất và đảm bảo khả năng bảo mật của các chương trình.

* Program

x=z-2;

y=2*z;

if(©) {

x=xt1;

y=ytl,

}

else {

x=x-l;

yay

}

LỆ Psa21

Hình 2.3: Ví dụ vé một đoạn chương trình uới CFG tương ứng

2.1.4. Strand

Nghiên cứu này của chúng tôi, sử dụng khái niệm về các Strand, một đơn vị

cơ bản được giới thiệu trong [1], đây là khái niệm có vai trò quan trọng trong phương pháp trích xuất và phân tích mã nhị phân này. Strand là một tập hợp các câu lệnh liên quan nhau mà khi kết hợp lại, chúng sẽ tạo thành một chuỗi

hoàn chỉnh thực hiện một nhiệm vụ nào đó trong chương trình.

Mỗi Strand trong chương trình có nhiệm vụ tính toán giá trị của một biến

nhất định. Bằng cách xem xét các Strand riêng biệt, chúng tôi có thể nắm bắt được các phụ thuộc dữ liệu và luồng điều khiển cụ thể liên quan đến biến đó. Điều này cho phép chúng tôi hiểu rõ hơn về cách các biến được sử dụng và thay

đổi trong chương trình.

Với việc ấp dụng khái niệm về Strand vào nghiên cứu, chúng tôi hy vọng xây dung một phương pháp trích xuất thông minh và mạnh mẽ, cho phép chúng tôi khám phá và nắm bắt tốt hơn về cấu trúc và chức năng của các chương trình

mã nhị phan.

2.1.5. Decompiler

Một decompiler là một công cu phần mềm có khả năng chuyển đổi mã máy (bytes code) thành mã nguồn có cấu trúc cao hơn, chẳng hạn như mã assembly. Việc sử dung decompiler có thể giúp phân tích và nằm bắt rõ hơn về chức năng

và logic của một chương trình đã được biên dịch. Hiện nay có rất nhìu decompiler

khác nhau như: IDA, Ghidra, Radare2, RetDec,...

Thong thường các decompiler có thể có các công dụng như sau:

e Trích xuất chức năng: Decompiler cho phép chuyển đổi mã máy không cấu trúc thành dạng mã có cấu trúc ( thường là assembly), giúp dễ dàng hiểu và phân tích các chức năng trong mã nhị phân.

e Tìm lỗi và sửa chữa: Decompiler hữu ích trong việc phát hiện và sửa

chữa các chương trình bị hỏng hoặc lỗi. Bằng cách chuyển đổi mã máy thành mã nguồn có cấu trúc, người phát triển có thể hiểu rõ hơn về

lỗi. Hơn nữa decompiler cho phép sửa chửa các bytes code trực tiếp lên chương trình nên sẽ dễ dàng sửa lỗi.

e Phân tích mã độc: Decompiler có thể dùng để phân tích mã độc với

khả năng để phát hiện và loại bỏ các phần tử gây hại trong chương

trình.

e Tương tác với phần mềm: Thông thường các decompiler hiện đại cũng cho phép việc gỡ lỗi trực tiếp chương trình.

2.1.5.1. IDA

Ỏ nghiên cứu này, chúng tôi cần sử dụng decompiler để trích xuất các địa chi

của các chức năng trong tập tin nhị phan, từ đó trích xuất ra các bytes code

của các chức năng đó.

Để phục vụ cho yêu cầu này, chúng tôi quyết định chọn IDA để thực hiện, ngoài là công cu decompiler quen thuộc thi IDA có các ưu điểm:

e Khả năng hỗ trợ nhiều kiến trúc: IDA hỗ trợ nhiều kiến trúc xử lý

khác nhau, cho phép phân tích mã nhị phân trên các nền tảng khác nhau như x86, ARM, MIPS và nhiều hơn nữa. Diều này đảm bảo rằng chúng tôi có thể phan tích và trích xuất thông tin từ các tập tin nhị

phân đa dạng.

e Dễ sứ dung: IDA có giao diện đồ hoa thân thiện và dé sử dụng, giúp chúng tôi dễ dàng tìm hiểu và thao tác với công cụ. Các tính năng

và chức năng được tổ chức một cách rõ ràng, cho phép chúng tôi dễ

đàng thao tác và điều hướng trong quá trình phân tích mã nhị phân.

e Tính linh hoạt và mở rộng: IDA cung cấp các khả năng mở rộng và plugin, cho phép chúng tôi tùy chỉnh và mở rộng khả năng của công

cụ để phù hợp với nhu cầu cụ thể của chúng tôi. Đặc biệt IDA còn cung cấp bộ API với tập hợp các hàm cho phép chúng tôi tương tác với IDA từ các chương trình bên ngoài. Bằng cách sử dụng IDA API,

chúng tôi có thể tự động hóa các tác vụ phân tích và trích xuất cho

công cụ của mình.

e Hỗ trợ phân tích động: Ngoài việc phân tích tĩnh, IDA cũng cung cấp

khả năng phân tích động. Diều này cho phép chúng tôi xem các giá trị biến, theo đõi luồng điều khiển, và thậm chí thực hiện gỡ rối trong

quá trình phân tích mã nhị phãn.

e Cộng đồng và tài liệu phong phú: IDA có một cộng đồng người dùng lớn, cung cấp sự hỗ trợ và tài liệu phong phú. Diều này giúp chúng tôi dé dàng xử lí khi gặp van dé.

2.1.5.2. IDA Python API

IDA Python API là một thành phan quan trong trong hệ thống IDA, nó cung

cấp một giao diện lập trình cho phép tương tác và mở rộng IDA bằng ngôn ngữ

Python. Với IDA Python API, chúng tôi có khả năng tự động hóa các tác vụ

phân tích các tập tin nhị phân trong nghiên cứu của mình.

Một số điểm nổi bật về IDA Python API:

e Truy cập thông tin trong tập tin nhị phân: IDA Python API cho phép

chúng tôi cập và trích xuất thông tin về các thành phần trong tập tin nhị phân như các chức năng, basie block, địa chỉ,.. bằng cách sử dụng các hàm như get_ func_ name(), get_ func_ offset(), get_operand_ value get_ segm_ start()....

e Khả năng tự động hóa : Với IDA Python API, chúng tôi có thể các tác

vụ phân tích tập tin nhị phân một cách tự động thông qua sử dụng

các hàm như analyze_ area(), auto_ wait(), wait_ for sync()

e Tích hợp với các công cụ khác: Bằng cách sử dụng các giao thức và

hàm liên kết IDA Python API có thể tích hợp IDA với các công cụ khác . Điều này rất giúp ích cho chúng tôi trong việc xây dựng công

cụ hoàn chỉnh trong phương phấp này.

Một phần của tài liệu Khóa luận tốt nghiệp An toàn thông tin: Phương pháp phát hiện sự tương đồng mã nhị phân của chương trình dựa trên học sâu trong an toàn phần mềm (Trang 21 - 26)

Tải bản đầy đủ (PDF)

(86 trang)