CHƢƠNG II: MƠ HÌNH PHÁT HIỆN MÃ ĐỘC
2.4.2 Cơng cụ trích xuất và phân tích mã lệnh của mã độc
Theo như cấu trúc của đoạn mã assembly, cĩ thể thấy thơng tin về mã lệnh là thơng tin quan trọng nhất. Với tập dữ liệu các mã lệnh cĩ thể dự đốn được hành vi của một chương trình. Các chương trình mã độc thường sẽ cĩ một số đoạn mã lệnh cĩ thứ tự giống nhau vì thực hiện các hành vi mục đích tương tự nhau. Như vậy, việc đọc được đoạn mã assembly của một chương trình và trích xuất được dữ liệu mã lệnh của chương trình là bước đầu tiên và quan trọng nhất trong quá trình phát hiện mã độc.
Một chương trình bình thường trung bình cĩ khoảng 1,5 triệu mã lệnh với khoảng 192 loại mã lệnh khác nhau. Trong số các mã lệnh này, cĩ 72 loại mã lệnh mà chiếm đến hơn 99,8% tổng số mã lệnh cĩ trong một chương trình, với 14 loại mã lệnh chiếm xấp xỉ 90% và nổi bật nhất trong số đĩ là 5 loại mã lệnh chiếm hơn 64% là mov, push, call, pop, cmp. Với các chương trình độc hại thường cĩ khoảng 665,000 mã lệnh với tổng số 141
loại mã lệnh khác nhau được tìm thấy. Tương tự như với chương trình bình thường, 14 loại mã lệnh phổ biến nhất chiếm hơn 92% và 5 loại mã lệnh chính chiếm xấp xỉ 65% tổng số mã lệnh. Bảo dưới đây so sánh mật độ xuất hiện (%) của 14 loại mã lệnh phổ biến nhất trong chương trình bình thường và 7 loại mã độc khác nhau.
Mã lệnh Bình thƣờn g Kernel RK User
RK Tools Bot Trojan Virus
Worm s mov 25,3 37 29 25,4 34,6 30,5 16,1 22,2 push 19,5 15,6 16,6 19 14,1 15,4 22,7 20,7 call 8,7 5,5 8,9 8,2 11 10 9,1 8,7 pop 6,3 2,7 5,1 5,9 6,8 7,3 7 6,2 cmp 5,1 6,4 4,9 5,3 3,6 3,6 5,9 5 jz 4,3 3,3 3,9 4,3 3,3 3,5 4,4 4 lea 3,9 1,8 3,3 3,1 2,6 2,7 5,5 4,2 test 3,2 1,8 3,2 3,7 2,6 3,4 3,1 3 jmp 3 4,1 3,8 3,4 3 3,4 2,7 4,5 add 3 5,8 3,7 3,4 2,5 3 3,5 3 jnz 2,6 3,7 3,1 3,4 2,2 2,6 3,2 3,2
retn 2,2 1,7 2,3 2,9 3 3,2 2 2,3
xor 1,9 1,1 2,3 2,1 3,2 2,7 2,1 2,3
Bảng II-2: Thống kê phân bố các loại mã lệnh phổ biến nhất trong các loại chƣơng trình
Cĩ nhiều cơng cụ giúp đọc được đoạn mã assembly của một chương trình như nasm, gdb, objdump, strace. Cơng cụ được sử dụng nhiều nhất là objdump. Objdump là cơng cụ giúp bạn xem các thơng tin quan trọng trong các file object hay file executable.
Để thực hiện đọc đoạn mã assembly của một chương trình, với cơng cụ objdump, người dùng cĩ thể sử dụng lệnh:
objdump –M <mã kiến trúc bộ vi xử lý chạy chương trình> -D <đường dẫn tới chương trình> > <đường dẫn tới nơi muốn lưu trữ file báo cáo>
Objdump hỗ trợ nhiều kiến trúc hệ bộ vi xử lý khác nhau như: x86-64, x86-64, i386, i8086, att, intel, att-mnemonic, intel-mnemonic, addr64, addr16, data32, data16, suffix, amd64, intel64.
Ví dụ, thực hiện biên dịch một chương trình “demo” chạy trên kiến trúc intel, người dùng thực hiện gõ lệnh: objdump –M intel –D demo > demo.txt. Kết quả thu được sẽ được lưu trong file demo.txt với nội dung như sau:
Disassembly of section .interp: 0000000000400238 <.interp>: 400238: 2f (bad)
400239: 6c ins BYTE PTR es:[rdi],dx
40023a: 69 62 36 34 2f 6c 64 imul esp,DWORD PTR [rdx+0x36],0x646c2f34 400241: 2d 6c 69 6e 75 sub eax,0x756e696c
400246: 78 2d js 400275 <_init-0x373> 400248: 78 38 js 400282 <_init-0x366> 40024a: 36 2d 36 34 2e 73 ss sub eax,0x732e3436 400250: 6f outs dx,DWORD PTR ds:[rsi] 400251: 2e 32 00 xor al,BYTE PTR cs:[rax] Disassembly of section .note.ABI-tag:
0000000000400254 <.note.ABI-tag>:
400254: 04 00 add al,0x0
400256: 00 00 add BYTE PTR [rax],al 400258: 10 00 adc BYTE PTR [rax],al 40025a: 00 00 add BYTE PTR [rax],al 40025c: 01 00 add DWORD PTR [rax],eax 40025e: 00 00 add BYTE PTR [rax],al 400260: 47 rex.RXB
400261: 4e 55 rex.WRX push rbp 400263: 00 00 add BYTE PTR [rax],al 400265: 00 00 add BYTE PTR [rax],al 400267: 00 02 add BYTE PTR [rdx],al 400269: 00 00 add BYTE PTR [rax],al 40026b: 00 06 add BYTE PTR [rsi],al 40026d: 00 00 add BYTE PTR [rax],al 40026f: 00 20 add BYTE PTR [rax],ah
400271: 00 00 add BYTE PTR [rax],al ...
Disassembly of section .note.gnu.build-id: 0000000000400274 <.note.gnu.build-id>:
400274: 04 00 add al,0x0
400276: 00 00 add BYTE PTR [rax],al 400278: 14 00 adc al,0x0
40027a: 00 00 add BYTE PTR [rax],al 40027c: 03 00 add eax,DWORD PTR [rax] 40027e: 00 00 add BYTE PTR [rax],al 400280: 47 rex.RXB
400281: 4e 55 rex.WRX push rbp
400283: 00 57 27 add BYTE PTR [rdi+0x27],dl 400286: 42 rex.X
400287: 43 b7 9f rex.XB mov r15b,0x9f 40028a: 4d 3f rex.WRB (bad) 40028c: e7 81 out 0x81,eax
40028e: 87 84 84 9b 57 de a8 xchg DWORD PTR [rsp+rax*4-0x5721a865],eax 400295: 9a (bad)
400296: 77 ec ja 400284 <_init-0x364>
Sau khi đã thu được đoạn mã assembly của chương trình, hồn tốn cĩ thể thực hiện quá trình trích xuất thơng tin dữ liệu mã lệnh của chương trình để thực hiện phân tích và phát hiện xem chương trình cĩ phải chương trình mã độc khơng.