Giới thiệu - Công cụ nm được sử dụng để kiểm tra các file nhị phân bao gồm thưviện, modules đối tượng được biên dịch, file đối tượng được chia sẻ và các filethực thi độc lập rồi hiển thị
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA MẠNG MÁY TÍNH VÀ TRUYỀN
THÔNG
KỸ THUẬT PHÂN TÍCH MÃ ĐỘC
Một số công cụ phân tích tệp tin
GIẢNG VIÊN HƯỚNG DẪN
Trang 2I Công cụ nm
1 Giới thiệu
- Công cụ nm được sử dụng để kiểm tra các file nhị phân (bao gồm thưviện, modules đối tượng được biên dịch, file đối tượng được chia sẻ và các filethực thi độc lập) rồi hiển thị nội dung các file đó hoặc thông tin meta được lưutrữ trong đó, cụ thể là bảng biểu tượng
- Đầu ra từ nm phân biệt giữa các loại ký hiệu khác nhau Ví dụ, nó phânbiệt giữa một hàm được cung cấp bởi một modules đối tượng và một hàm đượcyêu cầu bởi nó
- Công cụ nm được sử dụng để trợ giúp gỡ lỗi, để giúp giải quyết các vấn đềphát sinh từ xung đột tên
2 Chức năng
- Công cụ nm có thể liệt kê các biểu tượng từ các file đối tượng Các lệnh
nm cung cấp thông tin về các ký hiệu đang được sử dụng trong một file đối tượnghoặc file thực thi
- Các thông tin mặc định mà lệnh nm cung cấp:
• Địa chỉ ảo của biểu tượng
• Một ký tự mô tả loại ký hiệu Nếu ký tự là chữ thường thì thuộc
về local, nếu là chữ hoa thì external
• Tên của biểu tượng
3 Một số cờ thông dụng
Cách mặc định sử dụng ‘nm’:
Nếu không có tên thực thi nào được chỉ định, tên sẽ là ‘a.out’
a Hiển thị file đối tượng tham chiếu đến một biểu tượng
Trang 3Lệnh trên đã hiển thị tất cả các file đối tượng tham chiếu đến biểu tượng ‘func’trong folder hiện tại.
b Hiển thị tất cả các biểu tượng không xác định trong một file thực thi
Lệnh trên liệt kê tất cả các ký hiệu không xác định trong file thực thi ‘1’
c Hiển thị tất cả các biểu tượng trong một thực thi
Trang 4Lệnh trên liệt kê tất cả các ký hiệu trong ‘namepid’ nhưng theo thứ tự sắp xếpđịa chỉ của chúng.
d Tìm kiếm một biểu tượng và hiển thị kích thước của nó
Lệnh trên tìm kiếm một biểu tượng ‘abc’ và hiển thị kích thước của nó
e Hiển thị các biểu tượng động trong một thực thi
Lệnh trên hiển thị các ký hiệu động trong file thực thi ‘1’
f Trích xuất biểu tượng của các loại khác nhau
Trang 5Một tính năng mạnh mẽ khác của lệnh nm là có thể trích xuất biểu tượng từnhiều loại đối tượng định dạng file khác nhau.
g Thay đổi định dạng đầu ra nm
Mặc định, định dạng đầu ra được hiển thị bởi nm là kiểu bsd Có thể thay đổiđịnh dạng này bằng cách sự dụng cờ -f như ví dụ dưới đây:
Lệnh trên hiển thị đầu ra theo kiểu ‘posix’
h Chỉ hiển thị các biểu tượng bên ngoài của một thực thi
i Sắp xếp đầu ra nm theo kích thước ký hiệu
j Chỉ định tùy chọn nm trong một file
Một tính năng có giá trị khác của nm là nó có thể lấy đầu vào dòng lệnh của nó
từ một file: chỉ định tất cả các tùy chọn trong file và chỉ định tên file cho lệnhnm
II Công cụ Otool
1 Giới thiệu
Trang 6- Công cụ Otool chạy trên hệ điều hành Mac OS, hỗ trợ cả phân tích tĩnh
và phân tích động
- Otool trợ giúp hiển thị các phần được chỉ định của file hoặc thư viện đối tượng
- Nó có thể hiển thị thông tin được chỉ định ở dạng thô (số) hoặc ở dạngcác biểu tượng sử dụng tên macro của các hằng số
2 Cài đặt Otool
- Otool không phải là một cài đặt mặc định, nhưng nó có sẵn như
một phần module công cụ dòng lệnh của Xcode và có hai cách để có được
nó:
● Tải về 1.5 GB Xcode App (có chứa 100MB công cụ dòng lệnh).
Cách này là đơn giản nhất vì nó có thể giúp tự động tải xuống và càiđặt
● Thiết lập tài khoản của nhà phát triển và tải xuống Nhà phát triển ở đây
là Apple Có thể đăng kí tài khoản với email tạihttps://developer.apple.com/programs/register/và kết nối với sitehttps://developer.apple.com/downloads/để tải xuống công cụ dòng lệnhphù hợp cho Xcode từ danh sách
Hình trên là giao diện yêu cầu xác nhận điều khoản người dùng trước khi đượcphép tải xuống
-3 Một số tùy chọn thông dụng của Otool
-a: Hiển thị tiêu đề lưu trữ
Trang 7-S: Hiển thị nội dung của tệp có đuôi SYMDEF nếu là tệp lưu trữ.
-f: Hiển thị toàn bộ headers
-h: Hiển thị Mach header
-t: Hiển thị nội dung của section (text)
-d: Hiển thị nội dung của section (data)
-o: Hiển thị nội dung của segment OBJC được dùng bởi hệ thống thời gian chạy.-c: Hiển thị các chuỗi đối số từ lõi của file argv[ ] và envp[ ]
-I: Hiển thị bảng ký hiệu gián tiếp
-T: Hiển thị nội dung của một thư viện được chia sẻ liên kết động
-R: Hiển thị bảng liên thư viện được chia sẻ liên kết động có liên quan
-M: Hiển thị bảng modules của thư viện được chia sẻ liên kết động
-H: Hiển thị bảng gợi ý namespace hai lớp
-G: Hiển thị dữ liệu trong bảng code
-C: Hiển thị gợi ý tối ưu hóa trình liên kết
-P: In ra thông tin danh sách saction dưới dạng chuỗi
-function_offsets: Khi thực hiện tháo gỡ offset thập phân từ nhãn in cuối cùng.-j: Khi thực hiện tháo gỡ các byte opcode của hướng dẫn
-m: Tên file đối tượng không được giả định là có trong lưu trữ (thành viên), chophép tên file chứa dấu ngoặc đơn
version: in ra thông tin phiên bản hiện tại của otool
*Câu hỏi: Nêu các chức năng của công cụ nm tool:
- Kiểm tra các file nhị phân (bao gồm thư viện, modules đối tượng đượcbiên dịch, file đối tượng được chia sẻ và các file thực thi độc lập) rồi hiển thị nộidung các file đó hoặc thông tin meta được lưu trữ trong đó, cụ thể là bảng biểutượng
Trang 8- Trợ giúp gỡ lỗi, để giúp giải quyết các vấn đề phát sinh từ xung đột tên.
- Liệt kê các biểu tượng từ các file đối tượng, cung cấp thông tin về các
ký hiệu đang được sử dụng trong một file đối tượng hoặc file thực thi
III Công cụ Ldd:
1 Giới thiệu:
Ldd (List Dynamic Dependencies) là một tiện ích dòng lệnh chạy trên hệ điều
hành *unix
Ldd cho phép xem các thư viện được sử dụng bởi một chương trình được chỉ định
Lưu ý: Không nên chạy lênh ldd với một chương trình không đáng tin cậy vì lệnh ldd khi chạy sẽ thực thi chương trình.
version in ra thông tin phiên bản
-d, data-relocs tái định vị lại dữ liệu trong tiến trình
-r, function-relocs tái định vị lại dữ liệu và hàm trong tiến trình
Trang 9-u, unused in ra thư viện không sử dụng trực tiếp.
-v, verbose in ra tất cả thông tin
3 Video demo:
https://drive.google.com/open?id=1gmEhEITg2bpDNb1U01QS4trhPZQGwcaP
IV Công cụ Dumpbin:
1 Giới thiệu:
- Dumpbin là một tiện ích dòng lệnh chạy trên hệ điều hành Windows
- Dumpbin được cài đặt kèm theo bộ Visual Studio IDE
- Tiện ích này hiển thị thông tin về các tập tin thực thi exe, thư viện liên kếtđộng dll và dạng tập tin đối tượng chung COFF
Định dạng tệp đối tượng chung (COFF) là định dạng cho tệp thực thi, mã đốitượng và tập tin máy tính thư viện được chia sẻ, được sử dụng trên các hệ thốngUnix Nó được giới thiệu trong Unix System V, thay thế định dạng a.out đã sửdụng trước đây, và hình thành cơ sở cho các đặc tả mở rộng như XCOFF vàECOFF, trước khi được thay thế bởi ELF, được giới thiệu với SVR4 COFF và cácbiến thể của nó tiếp tục được sử dụng trên một số hệ thống giống Unix, trênMicrosoft Windows, trong môi trường EFI và trong một số hệ thống phát triểnnhúng Việc sử dụng rộng rãi nhất định dạng COFF ngày nay là PortableExecutable (PE) của Microsoft
2 Một số tùy chọn thông dụng:
● Cú pháp:
dumpbin [tùy chọn] [tập tin]
● Mặc định khi gõ dumpbin thì sẽ hiển thị ra các tùy chọn của lệnh này
● Một số tùy chọn hay dùng:
/ALL - in ra tất cả thông tin của tập tin ngoại trừ mã asm
/DEPENDENTS - in tên của các tập tin dll mà tập tin này sử dụng./DISASM[:{BYTES|NOBYTES}] - in ra mã asm của từng phân đoạn./EXPORTS - in ra các hàm mà dll này cung cấp
/HEADERS - in ra header của tập tin và mỗi phân đoạn trong đó
Trang 10/IMPORTS[:filename] - in ra các tập tin dll và các hàm tương ứng màứng dụng này sử dụng Với filename là tên dll cần lọc ra.
/OUT:filename - thay vì in ra console thì chuyển vào tập tin
/RANGE:vaMin[,vaMax] - cắt một đoạn tập tin, thường đi kèm vớilựa chọn /DISASM
/SECTION:name - in ra thông tin của phân đoạn chỉ định
/SUMMARY - in ra thông tin tóm tắt về tập tin
Objdump đa số được cài trước trong các bản phân phối linux với cấu trúc lệnh
Trang 11Hiện thị thông tin tổng thể của file thực thi thông qua –f option:
Hiện thị thông tin chi tiết của file thực thi thông qua option –p:
Trang 12Hiện thị nội dung của section header sử dụng option –h:
Trang 13Hiện thị nội dung của tất cả các header sử dụng option –x:
Trang 14Hiện thị nội dung mã assembly của phần executable sections sử dụng –d opition:
Hiện thị nội dung mã assembly của tất cả các section sử dụng –D option:
Trang 15Hiện thị nội dung của toàn bộ section bằng option –s:
Trang 16Hiện thị thông tin debug bằng –g option:
Hiện thị mục cấp phát động sử dụng –R option:
Trang 17Hiện thị chỉ mình section cần quan tâm bằng –j option:
3 Video demo sử dụng Objdump lấy 1 số thông tin của file:
https://youtu.be/U7HXZUsuEQA
Trang 18VI Công cụ C++ filt:
1 Giới thiệu:
Ta đã biết C++ cung cấp tính năng nạp chồng hàm Vậy làm khi những hàm trùngtên này được biên dịch xuống ngôn ngữ bậc thấp assembly thì phân biệt nhữnghàm assembly này bằng cách nào?
Câu trả lời là những hàm assembly này sẽ được gán một định danh riêng, tức làcác hàm ngôn ngôn ngữ C++ có thể trùng tên nhưng khi xuống assembly sẽ có tênkhác nhau Quá trình này gọi là mangling, công cụ C++filt cho phép làm ngược lạiquá trình này, tức là từ tên định danh trong assembly(hay được gọi là symbol) sẽchuyển ngược thành tên hàm trong C++
2 Ví dụ minh họa:
Ta có mã C sau:
Trang 20Ta đã thấy hàm print đã được mangling thành 3 hàm assxembly khác nhau Ta thửdùng c++filt để chuyển ngược 3 hàm này về hàm trong code C++.
3 Video demo:
https://youtu.be/n09kxlA_tVw