Tìm hiểu trình dịch ngược và IDA Pro trong an toàn bảo mật thông tin

MỤC LỤC

Nền tảng của IDA PRO

  • Các Hiển thị IDA Cấp Ba

    Theo trang web của Hex-Rays: "Giấy phép có tên được liên kết với một người dùng cụ thể và có thể được sử dụng trên bất kỳ máy tính nào mà người dùng đó sử dụng," trong khi "Giấy phép máy tính được liên kết với một máy tính cụ thể và có thể được sử dụng bởi các người dùng khác nhau trên máy tính đó miễn là chỉ có một người dùng hoạt động vào mọi thời điểm.". Trong quá trình này, IDA chuyển quyền kiểm soát cho mô-đun loader được chọn, nhiệm vụ của nó là tải tệp từ đĩa, phân tích thông tin tiêu đề tệp mà nó có thể nhận biết, tạo các phần chương trình chứa mã hoặc dữ liệu như được chỉ định trong tiêu đề của tệp, và cuối cùng, xác định các điểm nhập cụ thể vào mã trước khi trả quyền kiểm soát lại cho IDA. Nhiệm vụ của mô-đun xử lý là xác định loại lệnh tại địa chỉ đó, độ dài của lệnh tại địa chỉ đó, và vị trí(s) mà việc thực hiện có thể tiếp tục từ địa chỉ đó (ví dụ, lệnh hiện tại có phải là tuần tự hay nhảy nhánh không?).

    Trong các phiên bản IDA từ 5.1 trở về trước, cửa sổ Strings được mở sẵn như một phần của giao diện người dùng mặc định; tuy nhiên, từ phiên bản 5.2 trở đi, cửa sổ Strings không còn mở sẵn theo mặc định, mặc dù vẫn có thể mở qua View → Open Subviews → Strings. Ngoài việc cung cấp các tính năng tìm kiếm khá chuẩn mà bạn quen thuộc từ việc sử dụng trình soạn thảo văn bản hoặc xử lý từ, IDA phát triển và hiển thị một danh sách toàn diện các tham chiếu chéo hoạt động tương tự như các liên kết siêu văn bản trên một trang web.

    MANIPULATION

    Kiểu và dữ liệu

    Hiểu về dữ liệu được truyền vào các hàm là chìa khóa để phân tích ngược chữ ký của một hàm (bao gồm số lượng, kiểu và thứ tự các tham số cần thiết cho hàm), và vì vậy, làm nổi bật tầm quan trọng của việc hiểu cách các kiểu dữ liệu và cấu trúc dữ liệu được thao tác tại cấp độ ngôn ngữ lập trình hợp ngữ (assembly). Mặc dù các kiểu dữ liệu nguyên thủy thường phù hợp tự nhiên với kích thước của thanh ghi CPU hoặc toán tử hướng dẫn, các kiểu dữ liệu phức hợp như mảng và cấu trúc thường yêu cầu chuỗi hướng dẫn phức tạp hơn để truy cập các mục dữ liệu riêng lẻ chứa trong chúng. Trước khi chúng ta có thể thảo luận về tính năng của IDA để cải thiện tính đọc của mã sử dụng các kiểu dữ liệu phức hợp, chúng ta cần xem xét mã đó trông như thế nào.

    Khi một chương trình dường như đang sử dụng một cấu trúc mà IDA không có thông tin về bố cục, IDA cung cấp các tính năng để chỉ định cấu trúc và cho phép cấu trúc mới được định nghĩa được tích hợp vào phần giải mã. Thứ nhất, mặc dù IDA có thể biết về bố cục của một cấu trúc cụ thể, có thể thiếu thông tin đủ để IDA kết luận rằng chương trình sử dụng cấu trúc đó.

    Liên kết và đồ thị hóa

    Có hai lý do khiến việc sử dụng một cấu trúc có thể không được nhận dạng trong quá trình phân tích. Trong cả hai trường hợp, vấn đề có thể được khắc phục và trong cả hai trường hợp, giải pháp bắt đầu từ cửa sổ Cấu trúc. Bốn dòng đầu tiên trong cửa sổ Cấu trúc hoạt động như một lời nhắc liên tục về các hoạt động có thể thực hiện trong cửa sổ.

    Việc thêm một cấu trúc được khởi đầu bằng cách sử dụng phím INSERT, mở hộp thoại Tạo Cấu Trúc/Union như trong Hình 8-3. Nếu bạn quen thuộc với lý thuyết đồ thị, bạn có thể tưởng tượng địa chỉ như các nút trong một đồ thị có hướng và liên quan cắt xén như các cạnh trong đồ thị đó.

    4.ỨNG DỤNG IDA TRONG THỰC TẾ

    CÁCH SỬ DỤNG IDA PRO NÂNG CAO I. CUSTOMIZING IDA

    Đa phần, các tệp cấu hình được lưu trữ trong thư mục <IDADIR>/cfg, với một ngoại lệ đáng chú ý là tệp cấu hình cho các plugin, nằm tại <IDADIR>/plugins/plugins.cfg (plugins.cfg sẽ được trình bày trong Chương 17). Mặc dù bạn có thể thấy khá nhiều tệp trong thư mục cấu hình chính, hầu hết các tệp này được sử dụng bởi các module bộ xử lý và chỉ áp dụng khi các loại CPU cụ thể đang được phân tích. Các tùy chọn áp dụng cho tất cả các phiên bản của IDA thường được tìm thấy trong ida.cfg, trong khi idagui.cfg và idatui.cfg chứa các tùy chọn cụ thể cho các phiên bản giao diện đồ hoạ và phiên bản văn bản của IDA, tương ứng.

    Hộp thoại File -> Open được sử dụng trong phiên bản console đơn giản hơn nhiều so với hộp thoại được sử dụng trong phiên bản GUI, do đó, tất cả các lệnh liên kết tệp có sẵn trong idagui.cfg đều không có trong idatui.cfg. Mặc dù không có cách nào để cung cấp thông tin đầy đủ về mọi tùy chọn mà IDA cung cấp trong một chương, chúng tôi đã cố gắng chỉ ra những vị trí chính mà những tùy chọn đó có thể được tìm thấy.

    II . NHẬN DẠNG THƯ VIỆN SỬ DỤNG CÁC CHỮ KÝ FLIRT

    Phát hiện ra rằng mã đầu vào được tạo ra bởi các trình biên dịch khác nhau là độc đáo đến mức việc khớp chữ ký điểm nhập là một kỹ thuật hữu ích để xác định trình biên dịch có thể đã được sử dụng để tạo ra một tệp nhị phân cụ thể. Phần trong những khác biệt này là do sự thay đổi trong mã nguồn thư viện dẫn đến mã được biên dịch khác nhau, nhưng sự khác biệt lớn cũng đến từ việc sử dụng các tùy chọn biên dịch khác nhau, như cài đặt tối ưu hóa và việc sử dụng các phiên bản trình biên dịch khác nhau để xây dựng thư viện. Nếu bạn may mắn có một tệp nhị phân liên kết tĩnh mà không bị xóa các ký hiệu của nó, bạn ít nhất cũng sẽ có các tên hàm hữu ích (càng hữu ích càng tốt nếu lập trình viên tin cậy đã chọn tạo) để giúp bạn điều hướng qua mã nguồn.

    Cài đặt các tiện ích FLAIR đơn giản chỉ là việc giải nén nội dung của tệp Zip tương ứng, tuy nhiên, chúng tôi khuyến nghị mạnh mẽ bạn nên tạo một thư mục flair riêng biệt làm đích đến vì tệp Zip không được tổ chức với một thư mục cấp cao. Tệp chữ ký sử dụng một định dạng nhị phân độc quyền được thiết kế để giảm thiểu không gian cần thiết để biểu diễn toàn bộ thông tin có trong tệp mẫu và để cho phép so khớp chữ ký với nội dung cơ sở dữ liệu một cách hiệu quả.

    Mở rộng kiến thức của IDA

    Thông tin chi tiết cho mỗi hàm bao gồm tên hàm, số thứ tự ký hiệu liên kết, liệu hàm có sử dụng stdcall không, và nếu có, số byte hàm xóa từ ngăn xếp khi trả về, cùng với các ghi chú tùy chọn được hiển thị khi hàm được tham chiếu trong bản dịch. Chỉnh sửa các ghi chú hiện có là một việc đơn giản của việc định vị tệp ghi chú liên quan đến bộ xử lý mà bạn quan tâm (ví dụ, pc.cmt cho x86), thực hiện các thay đổi trong bất kỳ ghi chú nào mà bạn muốn chỉnh sửa nội dung, chạy loadint để tạo lại tệp ghi chú ida.int, và cuối cùng sao chép tệp ida.int kết quả vào thư mục chính của IDA, nơi nó sẽ được tải vào lần khởi động IDA tiếp theo. Mặc dù idsutils và loadint có vẻ không ngay lập tức hữu ích với bạn, nhưng bạn sẽ học được cách đánh giá khả năng của chúng khi bạn bắt đầu tiếp xúc với các trường hợp sử dụng của IDA không phổ biến hơn.

    Với một đầu tư thời gian tương đối nhỏ, việc tạo một tệp .ids hoặc .til duy nhất có thể tiết kiệm rất nhiều thời gian mỗi khi bạn gặp các thư viện được mô tả trong những tệp đó trong các dự án sau này. Mục đích dự kiến của các công cụ được đề cập trong chương này là cung cấp cho bạn tính linh hoạt để giải quyết các khoảng trống trong việc mô tả thư viện của IDA mỗi khi bạn rời khỏi các ứng dụng thông thường của IDA.

    CHAP14

    Ở Chương 7, chúng ta đã đề cập đến khái niệm của IDA về các ghi chú tự động, khi được bật, khiến IDA hiển thị các ghi chú mô tả mỗi lệnh ngôn ngữ hợp ngữ. Nguồn của những ghi chú định sẵn này là tệp <IDADIR>/ida.int, chứa các ghi chú được sắp xếp trước tiên theo loại CPU và sau đó là loại lệnh. Khi ghi chú tự động được bật, IDA tìm kiếm các ghi chú liên kết với mỗi lệnh trong bản dịch và hiển thị chúng trong lề phải nếu chúng có trong ida.int.

    Giống như các tiện ích bổ sung khác chúng ta đã thảo luận, loadint được tài liệu trong một tệp readme.txt đi kèm với bản phân phối loadint. Bản phân phối loadint cũng chứa các ghi chú định sẵn cho tất cả các module xử lý của IDA dưới dạng nhiều tệp .cmt.

    PATCHING BINARIES VÀ CÁC HẠN CHẾ CỦA IDA