2 điểm bởi GN⁺ 2024-03-18 | 1 bình luận | Chia sẻ qua WhatsApp
  • Kỹ thuật reverse engineering sử dụng mô hình ngôn ngữ lớn

1. Giới thiệu về LLM4Decompile và Decompile-Eval

  • Mục tiêu của nhóm là tạo ra và phát hành LLM mã nguồn mở chuyên dành cho dịch ngược đầu tiên, đồng thời xây dựng benchmark dịch ngược đầu tiên tập trung vào khả năng biên dịch lại và khả năng thực thi lại để đánh giá năng lực của nó.
  • Nhóm đã biên dịch một triệu mẫu mã C thu thập từ AnghaBench thành mã assembly bằng GCC, từ đó xây dựng bộ dữ liệu 4 tỷ token gồm các cặp assembly-mã nguồn.
  • Dựa trên bộ dữ liệu này, nhóm tinh chỉnh mô hình code LLM hàng đầu DeepSeek-Coder và xây dựng benchmark đánh giá Decompile-Eval dựa trên các câu hỏi HumanEval cùng các mẫu kiểm thử.
  • Việc đánh giá được thực hiện từ hai góc độ: liệu mã đã dịch ngược có thể được biên dịch lại thành công hay không, và liệu nó có vượt qua tất cả assertion trong các test case hay không.

2. Kết quả đánh giá

Chỉ số

  • Khả năng biên dịch lạikhả năng thực thi lại là các chỉ số quan trọng để kiểm chứng hiệu quả của quá trình dịch ngược.
  • Nếu mã đã dịch ngược có thể được biên dịch lại, đó là bằng chứng mạnh mẽ cho tính toàn vẹn cú pháp.
  • Tuy nhiên, chỉ cú pháp thôi không đảm bảo chương trình đó tương đương ngữ nghĩa với chương trình gốc, vì vậy khả năng thực thi lại là thước đo quan trọng để đánh giá độ chính xác ngữ nghĩa.
  • Khả năng biên dịch lại và khả năng thực thi lại lần lượt thể hiện việc khôi phục cú pháp và bảo toàn ngữ nghĩa, vốn là các yếu tố thiết yếu để việc dịch ngược có thể sử dụng được và đủ độ vững chắc.

3. Cách sử dụng mô hình

  • LLM4Decompile bao gồm các mô hình có từ 1,3 tỷ đến 33 tỷ tham số, và các mô hình này có thể dùng trên Hugging Face.
  • Ví dụ các mô hình: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • Mô hình NSP được huấn luyện trên mã assembly, với khả năng thực thi lại trung bình khoảng 0,17.
  • Mô hình UO được huấn luyện mà không có kiến thức trước về mức tối ưu hóa (O0~O3), với khả năng thực thi lại trung bình khoảng 0,21.
  • Ví dụ sử dụng mô hình: biên dịch mã C thành nhị phân, disassemble tệp nhị phân thành các chỉ thị assembly, rồi dùng LLM4Decompile để chuyển các chỉ thị assembly sang C.

4. Cách dùng Decompile-Eval

  • Dữ liệu được lưu dưới dạng danh sách JSON tại llm4decompile/decompile-eval/decompile-eval.json.
  • Có hướng dẫn chạy đánh giá trên một GPU với một tiến trình, cũng như cách dùng TGI (nhanh hơn 10 lần, hỗ trợ nhiều GPU và đa tiến trình).

5. Đang triển khai

  • LLM4Binary: dự kiến bổ sung bộ dữ liệu lớn hơn để pretrain mô hình trên mã assembly và mã C.
  • Decompiler-ALL: kế hoạch hỗ trợ thêm nhiều ngôn ngữ/nền tảng và cấu hình hơn (ví dụ: dịch ngược nhiều hàm).

6. Giấy phép

  • Giấy phép MIT

Ý kiến của GN⁺

  • LLM4Decompile đưa ra một cách tiếp cận mang tính đổi mới so với các phương pháp dịch ngược nhị phân hiện có, đặc biệt là nhờ tận dụng mô hình ngôn ngữ lớn để giúp việc dịch ngược chính xác và hiệu quả hơn.
  • Công nghệ này có thể rất hữu ích trong lĩnh vực bảo mật phần mềm, đồng thời hỗ trợ phân tích mã độc hoặc bảo trì các hệ thống legacy.
  • Việc khả năng thực thi lại của mã đã dịch ngược chưa hoàn hảo cho thấy công nghệ này vẫn còn dư địa để cải thiện. Cần thêm nghiên cứu để nâng cao độ chính xác và hiệu quả trong môi trường thực tế.
  • Các công cụ hiện có cung cấp chức năng tương tự gồm các decompiler thương mại và mã nguồn mở như Ghidra hay IDA Pro, nhưng LLM4Decompile mang đến một hướng tiếp cận mới dựa trên machine learning.
  • Khi áp dụng công nghệ này, cần cân nhắc chất lượng và phạm vi dữ liệu huấn luyện, độ chính xác của mô hình, tốc độ thực thi, v.v.; lợi ích là độ chính xác và tính linh hoạt cao, nhưng nhược điểm có thể là độ phức tạp của mô hình lớn và nhu cầu tài nguyên tính toán cao.

1 bình luận

 
GN⁺ 2024-03-18
Ý kiến trên Hacker News
  • Ý kiến về kết quả "khả năng chạy lại":

    • Khả năng chạy lại là một cách quan trọng để đo độ chính xác ngữ nghĩa. Bản kết quả decompile được biên dịch lại và chạy với các test case để đánh giá xem logic và hành vi của chương trình có được bảo toàn hay không. Khả năng biên dịch lại và khả năng chạy lại thể hiện việc khôi phục cú pháp và bảo toàn ngữ nghĩa, đây là những yếu tố thiết yếu để decompile hữu dụng và vững chắc.
  • Câu hỏi về độ tin cậy của kết quả decompile:

    • Đây là một câu hỏi nghiêm túc về việc liệu kết quả decompile có đáng tin hay không. Việc biên dịch lại có thể tạo ra mã máy khác, và đặc biệt có thể khó nhận diện các cấu trúc mới, vốn có thể là phần cốt lõi của mã. Người viết tự hỏi liệu khi chạy theo kiểu sinh sinh, LLM có cách nào báo cáo mức độ tin cậy đối với các phần cụ thể hay không. Có vẻ vẫn sẽ cần con người xác minh.
  • Một trường hợp sử dụng rất tốt cho fine-tuning LLM:

    • Đây là một trường hợp sử dụng tuyệt vời cho fine-tuning LLM vì có thể dễ dàng tạo ra bộ dữ liệu lớn gồm các cặp đầu vào/đầu ra từ mã C công khai.
  • Sự quan tâm đến việc huấn luyện module decompile dựa trên nhà phát triển:

    • Điều thú vị là liệu có thể huấn luyện một module decompile dựa trên các ứng dụng do một nhà phát triển cụ thể tạo ra hay không. Ví dụ, Super Mario 64 và Zelda 64 đã được decompile hoàn toàn, và các game N64 khác cũng đang được tiến hành. Người viết tự hỏi liệu điều đó có giúp decompile dễ hơn các game khác mà những nhà phát triển này từng làm hay không.
  • Sự quan tâm đến trường hợp sử dụng lý tưởng của decompiler và việc tạo bộ dữ liệu:

    • Một decompiler lý tưởng sẽ loại bỏ nhu cầu về mã nguồn độc quyền. Nhờ sự phong phú của mã C công khai, có thể dễ dàng tạo bộ dữ liệu gồm các cặp ASM và mã nguồn.
  • Giới thiệu về dự án decompiler dựa trên LLM mà cá nhân đang thực hiện:

    • Tôi đang phát triển một decompiler dựa trên LLM cho Python bytecode. Hiện chưa có nhiều người làm theo hướng nghiên cứu này, nhưng tôi nghĩ nó có thể trở nên thú vị khi ngữ cảnh chú ý dài hơn trở nên khả thi. Nếu ai biết nhóm nào có thể cộng tác, tôi rất quan tâm đến việc hợp tác.
  • Lo ngại về benchmark không có so sánh với cách tiếp cận dựa trên AI:

    • Thật tuyệt khi thấy nhiều cách tiếp cận khác nhau, nhưng benchmark có thể không có nhiều ý nghĩa nếu không so sánh với các cách tiếp cận không dùng AI như IDA Pro. Sẽ rất thú vị nếu thấy mô hình này thể hiện thế nào trên các metric trong các bài báo bảo mật.
  • Sự chú ý đến khoảng cách lớn giữa điểm khả năng biên dịch lại và khả năng chạy lại:

    • GPT4 đạt mức 8x% về khả năng biên dịch lại (đúng về mặt cú pháp), nhưng chỉ đạt mức 1x% tệ hại về khả năng chạy lại (đúng về mặt khái niệm), một lần nữa cho thấy khả năng bắt chước quá mức của nó.
  • Thắc mắc về so sánh với các decompiler không phải LLM:

    • Tôi muốn biết việc so sánh với các decompiler không dùng LLM như IDA, Binja... ra sao. Có vẻ chỉ thấy so sánh với các LLM khác.
  • Sự tò mò về việc mô hình 6b cho kết quả tốt hơn mô hình 33b:

    • Thật thú vị khi mô hình 6b cho kết quả tốt hơn mô hình 33b. Tôi tự hỏi liệu mô hình 33b có cần nhiều dữ liệu huấn luyện hơn hay không. Mô hình 33b được pretrain trên khoảng 1 triệu chương trình C, trong khi DeepSeek-Coder được huấn luyện với 2 nghìn tỷ token, tức là nhiều dữ liệu hơn vài bậc.