Tải bản đầy đủ (.docx) (21 trang)

KỸ THUẬT PHÂN TÍCH MÃ ĐỘC: Một số công cụ phân tích tệp tin

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (977.41 KB, 21 trang )

ĐẠ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
Nguyễn Tấn Cầm

Nhóm sinh viên:
Huỳnh Tấn Duy

– 14520214

Đỗ Bá Tứ Mỹ

– 14520541

Nguyễn Hoàng Thanh

– 14520842


I. 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 file thực thi
độc lập) rồi hiển thị nội dung các file đó hoặc thông tin meta được lưu trữ 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ân biệt giữa
một hàm được cung cấp bởi một modules đối tượng và một hàm được yê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ượng hoặ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


Lệ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


Lệ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


Mộ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ệnh
nm.

II. Công cụ Otool
1. Giới thiệu


- 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ạng cá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ại
và kết nối với site
để tải xuống công cụ dòng lệnh
phù 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 được
phé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ữ.



-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.
-l: Hiển thị các lệnh load.
-L: Hiển thị tên và phiên bản của thư viện được chia sê cũng như ID thư viện.
-D: Chỉ hiển thị tên cài đặt của thư viện được chia sẻ.
-s: Hiển thị nội dung section (segname, sectname). Nếu cờ -v được chỉ định,
section được hiển thị dưới dạng loại của nó, trừ khi loại là không.
-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), cho
phé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 được biê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ội dung các

file đó hoặc thông tin meta được lưu trữ trong đó, cụ thể là bảng biểu tượ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.
- 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.
Ví dụ:

Như ví dụ trên dòng đầu là tên thư viện: linux-gate.so.1 và mã hex sau đó là địa
chỉ của thư viện trên bộ nhớ khi được tải lên.
Ở dòng thứ hai chúng ta thấy có kí hiệu =>, sau kí hiệu đó là đường dẫn đến thư
viện trên ổ cứng và mã hex là địa chỉ của thư viện sẽ được tải lên bộ nhớ.

2. Một số tùy chọn thông dụng:
 Cú pháp:
ldd [tùy chọn] <đường dẫn tuyệt đối đến tập tin>
 Tùy chọn:
 --help in ra các tùy chọn.
 --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.
 -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:
/>
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ã đối
tượ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ống
Unix. 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ác
biế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ên
Microsoft Windows, trong môi trường EFI và trong một số hệ thống phát triển
nhúng. Việc sử dụng rộng rãi nhất định dạng COFF ngày nay là Portable
Executable (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 đó.
 /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ới lự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.

3. Video demo:
/>
V. Công cụ Objdump:
1. Giới thiệu:
Objdump là một công chụ cho phép đọc các thông tin của các object files, hay các
file thực thi. Thường được sử dụng trong reverse engineering hoặc cũng có thể
dùng cho các developer làm công cụ debug.
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 cơ
bản.
objdump [tùy chọn] <tập tin>

2. Các ví dụ minh họa:
Ta có 1 file C đơn giản như sau được compile ra một file thực thi
#include<stdio.h>

int main(void)
{
int n = 6;

float f=1;
int i = 1;
for(;i<=n;i++)
f=f*i;
printf("\n Factorial is : [%f]\n",f);


return 0;
}

Hiệ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:



Hiện thị nội dung của section header sử dụng option –h:


Hiện thị nội dung của tất cả các header sử dụng option –x:


Hiệ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:


Hiện thị nội dung của toàn bộ section bằng option –s:



Hiệ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:


Hiệ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:
/>

VI. 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ùng
tên này được biên dịch xuống ngôn ngữ bậc thấp assembly thì phân biệt những
hà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ên
khác nhau. Quá trình này gọi là mangling, công cụ C++filt cho phép làm ngược lại
quá 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++.

 Cú pháp:
c++filt [tùy chọn] <tên đã được sửa(mangled names )>
 Tùy chọn:
 -_: Có dấu gạch dưới.
 -n : không có dấu gạc dưới.
 -p : Không có tham số
 -s : Định dạng (kiểu biên dịch)
 -i : Xuất kết quả vắn tắt


2. Ví dụ minh họa:
Ta có mã C sau:
#include <iostream>


using namespace std;

class printData {
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}
void print(double f) {
cout << "Printing float: " << f << endl;
}
void print(char* c) {
cout << "Printing character: " << c << endl;
}
};

int main(void) {
printData pd;

// Call print to print integer
pd.print(5);

// Call print to print float
pd.print(500.263);

// Call print to print character

pd.print("Hello C++");

return 0;
}

Trong ví dụ trên ta rõ ràng thấy hàm print() sử dụng kỹ thuật overload, Trong code
C++ ba hàm đều tên print(), ta dùng Objdump với option -t kiểm tra xem 3 hàm
này khi chuyển xuống assxembly thì đổi tên ra sao.


Ta đã 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:
/>
-------HẾT-------




×