Trả lời: - Để hiểu rõ cách nó hoạt động như nào ta sẽ sử dụng công cụ IDA Pro để phân tích.. - Mục đích của chương trình này là sử dụng hàm InternetGetConnectedState để kiểm tra trạng t
Trang 1BAN CƠ YẾU CHÍNH PHỦ
Giảng viên hướng dẫn : Ths Đặng Xuân Bảo
Sinh viên thực hiện:
Nguyễn Văn Khải AT190128 Nguyễn Đức Duy
Nguyễn Tiến Đạt
AT190116 AT170209 Nguyễn Tùng Dương AT190115
Hà Nội, 2025
Trang 2MỤC LỤC DANH MỤC HÌNH ẢNH
LỜI CẢM ƠN
PHÂN TÍCH VÀ TRẢ LỜI CÂU HỎI LAB 6.2 1
Question 1: What operation does the first subroutine called by main perform? 1
Question 2: What is the subroutine located at 0x40117F? 3
Question 3: What does the second subroutine called by mail? 5
Question 4: What type of code construct is used in this subroutine? 6
Question 5: Are there any network-based indicators for this program? 10
Question 6: What is the purpose of this malware? 10
PHÂN TÍCH VÀ TRẢ LỜI CÂU HỎI LAB 13.1 15
Question 1: Compare the strings in the malware (from the output of the strings command) with the information available via dynamic analysis Based on this comparison, which elements might be encoded? 15
Question 2: Use IDA Pro to look for potential encoding by searching for the string xor What type of encoding do you find? 18
Question 3: What is the key used for encoding and what content does it encode? 21
Question 4: Use the static tools FindCrypt2, Krypto ANALyzer (KANAL), and the IDA Entropy Plugin to identify any other encoding mechanisms.What do you find ? 24
Question 5: What type of encoding is used for a portion of the network traffic sent by the malware? Dịch: Loại mã hóa nào được sử dụng cho một phần lưu lượng mạng mà mã độc gửi đi? 25
Question 6: Where is the Base64 function in the disassembly? 28
Question 7: What is the maximum length of the Base64-encoded data that is sent? What is encoded? 33
Question 8: In this malware, would you ever see the padding characters (= or ==) in the Base64-encoded data? 35
Question 9: What does this malware do? 38
TÀI LIỆU THAM KHẢO BẢNG PHÂN CHIA CÔNG VIỆC
Trang 3DANH MỤC HÌNH ẢNH
Hình 1.1: Cửa sổ IDA Pro tại hàm main 1
Hình 1.2: Giao diện graph view của hàm sub_401000 2
Hình 1.3: Nhảy tới địa chỉ 0x40117F 3
Hình 1.4: Giao diện disassembly của hàm sub_40117F trong IDA Pro 3
Hình 1.5: Giao diện disassembly tại loc_40115C trong IDA Pro 4
Hình 1.6: Hàm sub_401040 5
Hình 1.7: Sơ đồ luồng của sub_401040 6
Hình 1.8: Sơ đồ luồng từ đoạn loc_40109D 7
Hình 1.9: Chuyển kí tự về dạng ASCII 8
Hình 1.10: Quá trình chỉnh sửa kích thước biến buffer 8
Hình 1.11: Trước và sau khi chỉnh sửa 9
Hình 1.12: Mã giả code của sub_401040 9
Hình 1.13: Sơ đồ luồng từ hàm main 10
Hình 1.14: Chọn interface tương ứng để bắt gói tin 12
Hình 1.15: Thông báo hiện ra sau khi thực thi mã độc trên cmd 12
Hình 1.16: Bắt request gửi yêu cầu tới cc.html(1) 13
Hình 1.17: Follow tcp stream request 13
Hình 1.18: CMD sau khi thực thi xong mã độc 14
Hình 2.1: Kết quả BinText – các chuỗi DLL và API 15
Hình 2.2: Kết quả của BinText-chuỗi User-Agent và mẫu URL 16
Hình 2.3: Gói tin HTTP từ Wireshark – mã độc gửi yêu cầu GET 17
Hình 2.4: Follow tcp stream request 17
Hình 2.5: Log của InetSim trên máy chủ Kali Linux 18
Hình 2.6: Kết quả tìm kiếm lệnh xor 19
Hình 2.7: Đoạn mã disassembly thể hiện lệnh XOR (xor eax, 3Bh) 20
Hình 2.8: Kết quả của chuỗi tìm kiếm sub_401190 21
Hình 2.9: Đoạn mã chứa lời gọi sub_401190 21
Hình 2.10: Đoạn mã chứa các hàm API xử lý tài nguyện 22
Hình 2.11: Đoạn mã chứa hàm FindResourceA 22
Hình 2.12: Kiểm tra resource với PEview 23
Hình 2.13: Tìm kiếm chuỗi cần giải mã 23
Hình 2.14: Kết quả sau khi thực hiện giải mã 23
Trang 4Hình 2.15: Bảng BASE64 tại địa chỉ 0x004050E8 24
Hình 2.16: Đoạn mã tại địa chỉ 0x4050E8 trong IDA Pro 24
Hình 2.17: Kết quả sau khi chuyển đoạn mã sang string 25
Hình 2.18: Đoạn mã thực hiện thuật toán Base64 encode 25
Hình 2.19: Sinh kí tự Base64 đầu tiên 26
Hình 2.20: Sinh ký tự Base 64 thứ hai 27
Hình 2.21: Sinh kí tự Base 64 thứ 3 27
Hình 2.22: Tìm được chuỗi bảng mã base64 trong công cụ bintext 29
Hình 2.23: Giải mã Base64 chuỗi path trong header HTTP 30
Hình 2.24: IDA Pro tạo ghi chú hàm tên sub_401000 đã tham chiếu dữ liệu tới địa chỉ 0x004050E8 31
Hình 2.25: Hàm sub_401000 gọi đến các bảng mã Base64 32
Hình 2.26: Bảng tham chiếu tới hàm sub_401000 32
Hình 2.27: Hàm 4010B1 gọi tới hàm 401000 33
Hình 2.28: Bảng tham chiếu tới hàm sub_4010B1 34
Hình 2.29: Phân tích hàm sub_4011C9 34
Hình 2.30: Các bước mã hóa base64, thêm padding 36
Hình 2.31: Hàm sub_401000 tiếp tục mã hóa base64 từng phần một 37
Hình 2.32: Bảng tham chiếu đến hàm sub_4011C9 39
Hình 2.33: Các bước thực hiện gửi beacon, đặt thời gian chờ, kiểm tra phản hồi 40 Hình 2.34: Hàm loc_4012EA kiểm tra điều kiện, trả về kết quả kết thúc gửi beacon 41
Trang 5NHÓM SINH VIÊN THỰC HIỆN
Nguyễn Văn Khải Nguyễn Đức Duy Nguyễn Tiến Đạt Nguyễn Tùng Dương
Trang 6PHÂN TÍCH VÀ TRẢ LỜI CÂU HỎI LAB 6.2
Question 1: What operation does the first subroutine called by main perform? Dịch: Thao tác đầu tiên được hàm main gọi trong mã độc thực hiện là gì?
Công cụ: IDA Pro
Trả lời:
- Để hiểu rõ cách nó hoạt động như nào ta sẽ sử dụng công cụ IDA Pro để phân tích
- Trước tiên, ta load tệp Lab06-02.exe vào IDA Pro và chuyển sang chế độ Graph View
Hình 1.1: Cửa sổ IDA Pro tại hàm main
- Ta sẽ thấy sub_401000 là sub được call đến đầu tiên
- Nháy đúp vào sub_401000 sẽ được cửa sổ view như hình dưới với 2 nhánh rẽ sau
lệnh so sánh :
Trang 7Hình 1.2: Giao diện graph view của hàm sub_40100
- Giá trị trả về được so sánh với 0 :
• Nếu hàm trả về 0, ZF =1, CF = 0, PF =0, OF = 0; Chuyển đến khối chương trình loc_40102B hiển thị chuỗi Error 1.1: No Internet\n
• Nếu hàm trả về 1, ZF = 0, CF = 0, PF =1, OF = 0; Chuyển đến khối chương
có mũi tên trình màu đỏ, khối chương trình hiển thị: Success: Internet Connection\n
Đây vẫn là một câu lệnh if sử dụng hàm InternetGetConnectedState
- Mục đích của chương trình này là sử dụng hàm InternetGetConnectedState
để kiểm tra trạng thái kết internet và đưa ra thông báo tùy thuộc vào kết quả của kết nối
• Nếu biến trả về true, nó sẽ in chuỗi Success : Internet Connection
• Nếu không, nó sẽ in ra chuỗi Error : No Internet
Kết luận: Subroutine đầu tiên được gọi bởi hàm main là sub_401000 Nó thực hiện
kiểm tra trạng thái kết nối Internet của hệ thống bằng hàm InternetGetConnectedState
• Nếu máy có kết nối Internet, chương trình in: “Success: Internet Connection”
• Nếu không có kết nối, chương trình in: “Error: No Internet”
Trang 8Question 2: What is the subroutine located at 0x40117F?
Dịch: Chương trình con ở địa chỉ 0x40117F là gì?
Công cụ: IDA Pro
Trả lời:
- Để biết chương trình con ở địa chỉ 0x40117F ta sẽ sử dụng công cụ IDA Pro
- Trước tiên, để chuyển hướng đến địa chỉ 0x40117F trong IDA Pro, nhấn G, nhập 0x40117F và nhấn Enter; chương trình sẽ di chuyển con trỏ đến vị trí mã đó:
Hình 1.3: Nhảy tới địa chỉ 0x40117F
Hình 1.4: Giao diện disassembly của hàm sub_40117F trong IDA Pro
- Từ hình ảnh thu được ta sẽ tiến hành phân tích subroutine sub_40117F:
• Chức năng:
o Sub_40117F là hàm hiển thị chuỗi đã format, tương tự như printf Nó có khả năng in ra console hoặc ghi vào file tùy ngữ cảnh
• Cơ chế hoạt động:
1 Chuẩn bị stack và bảo toàn các register (ebx, esi, edi)
2 Thiết lập buffer tạm thời qua stbuf
3 Xử lý và format chuỗi đầu vào bằng sub_4013A2
Trang 94 Xuất nội dung buffer ra kênh output thực tế thông qua ftbuf
5 Dọn dẹp stack và trả quyền điều khiển về caller
• Tham số:
o arg_4: địa chỉ chuỗi ký tự hoặc format string
o arg_0: giá trị bổ sung cho format string (ví dụ %c, %d)
- Trong lệnh gọi tới 0x40117F tại loc_4015c, chúng ta nhận thấy rằng 2 tham số được đẩy lên ngăn xếp trước lệnh gọi
Hình 1.5: Giao diện disassembly tại loc_40115C trong IDA Pro
- Một tham số là chuỗi "Success: Parsed command is %c\n" và tham số còn lại là byte được trả về từ lệnh gọi trước đó tại 0x401148 Vì có các ký tự định dạng như
%c nên ở đây ta biết được đây là một chuỗi được định dạng %c in ra biểu diễn ASCII của ký tự %d in giá trị thập phân của nó
- Như vậy, có thể xác định rằng sub_40117F đóng vai trò cốt lõi trong việc hiển thị thông tin và thông báo trạng thái của chương trình, đảm bảo chuỗi được in ra an toàn
và hỗ trợ định dạng
Kết luận:
- Subroutine nằm ở địa chỉ 0x40117F là sub_40117F Nó là một hàm in chuỗi có định dạng (printf-like) — nhận một format string và các đối số, định dạng vào buffer tạm, rồi xuất buffer đó ra kênh đầu ra (console / file) an toàn
Trang 10Question 3: What does the second subroutine called by mail?
Dịch: Chương trình con thứ hai được hàm main gọi có chức năng gì?
Công cụ: Sử dụng IDA Pro
Trả lời:
1 Mở file Lab_006-02.exe trong IDA Pro
2 Trong cửa sổ Functions/Names, ta thấy chương trình con thứ 2 ở đây là
được sử dụng cho các lời gọi tiếp theo
• InternetOpenUrlA: Dùng handle từ InternetOpenA để mở URL cụ thể:
http://www.practicalmalwareanalysis.com/cc.htm
- Nếu mở thành công, trả về một handle file (hFile) cho phép đọc dữ liệu từ URL
Sau khi gọi InternetOpenUrlA, chương trình thực hiện lệnh so sánh:
Trang 11Đây chính là cấu trúc điều kiện if, phân nhánh thành công hoặc thất bại
• Nếu hFile == 0: chương trình đi vào nhánh lỗi, in thông báo “Error 2.1:
Fail to OpenUrl” và gọi InternetCloseHandle để đóng kết nối
• Nếu hFile != 0: chương trình nhảy tới loc_40109D để tiếp tục xử lý (đọc dữ
liệu bằng InternetReadFile)
Kết luận:
- Chức năng chính của sub_401040 là tải nội dung trang web
http://www.practicalmalwareanalysis.com/cc.htm để chuẩn bị cho quá trình phân
tích phần mở đầu HTML
Question 4: What type of code construct is used in this subroutine?
Dịch: Chương trình con này sử dụng loại cấu trúc lập trình nào?
Công cụ sử dụng: IDA Pro
Trả lời:
- Theo câu 3, chương trình con ở đây là sub_401040
1 Mở file Lab_006-02.exe trong IDA Pro
2 Trong cửa sổ Functions/Names, chọn sub_401040 để nhảy tới hàm đó
3 Nhấn phím Space để chuyển giữa disassembly view và graph view (sơ đồ
luồng) nhằm quan sát cấu trúc lệnh và các nhánh rẽ
Hình 1.7: Sơ đồ luồng của sub_401040
Trang 12- Trong hình trên ta thấy hàm sub_401040 gọi các API InternetOpenAvà
InternetOpenUrlA để mở URL
• InternetOpenA: Hàm này khởi tạo một session để các hàm WinINet khác có
thể dùng để thực hiện các thao tác mạng (HTTP, FTP ) Nó tạo ra một
"Internet handle" dùng chung cho toàn bộ kết nối sau đó
• InternetOpenUrlA: Hàm này dùng handle từ InternetOpenA để mở một URL
cụ thể Nó gửi request đến server, nếu thành công sẽ trả về một handle file (hFile) cho phép đọc dữ liệu từ URL
- Sau đó có lệnh so sánh cmp [ebp+hFile], 0 kết hợp với jnz(nhảy nếu không bằng 0) → đây là cấu trúc điều kiện if, phân nhánh thành công hoặc thất bại
- Nếu khác 0, chương trình nhảy xuống nhánh đỏ và in ra thông báo “Error 2.1: Fail
to OpenUrl” và đóng handle (InternetCloseHandle)
- Nếu bằng 0, chương trình nhảy vào loc_40109D Sau đó ta xem loc_40109D
Hình 1.8: Sơ đồ luồng từ đoạn loc_40109D
- Trong hình trên ta thấy sau khi gọi InternetReadFile với tham số 0x200 (512
byte), chương trình tiến hành kiểm tra số byte đọc được
- Nếu giá trị bằng 0 → nhảy xuống nháy đỏ nhánh lỗi được thực thi, in thông báo
“Error 2.2: Fail to ReadFile” và đóng handle (InternetCloseHandle)
- Nếu giá trị khác 0 → chương trình nhảy xuống nháy xanh và tiếp tục xử lý dữ liệu
trong Buffer
Trang 13- Lệnh cmp kiểm tra xem ký tự đầu tiên có bằng 0x3C hay không (tương ứng với
ký hiệu < trong ASCII) Đặt con trỏ vào vị trí 3Ch nhấn phím tắt R thì IDA Pro sẽ đổi nó thành ký tự < , để trở lại nhấn phím Q Theo cách tương tự, ta có thể thực hiện tương tự với 21h , 2Dh và 2Dh
Hình 1.9: Chuyển kí tự về dạng ASCII
- Để nhận diện chính xác mảng Buffer (512 byte) trong sub_401040, ta chỉnh lại mô
tả ngăn xếp của hàm trong IDA Pro Thao tác thực hiện như sau: mở hàm
sub_401040 trong IDA, nhấn Ctrl+K để hiện hộp thoại Stack of sub_401040, nhấp chuột phải lên vùng biến tương ứng → chọn Array, đặt Array size = 512 và
Element print width = 1 (một phần tử = 1 byte), rồi nhấn OK để áp dụng
Hình 1.10: Quá trình chỉnh sửa kích thước biến buffer
Kết quả: IDA sẽ hiển thị Buffer như một mảng 512 byte trong toàn bộ hàm, giúp việc phân tích các phép so sánh trên từng byte (ví dụ kiểm tra <! ) trở nên rõ ràng
và chính xác hơn
Trang 14Hình 1.11: Trước và sau khi chỉnh sửa
- 4 byte đầu tiên của bộ đếm được so sánh để xem liệu chúng có phải là những ký tự
<!- - này không (chuỗi ký tự này là phần đầu của nhận xét HTML) Trong IDA Pro,
nhấn Space để chuyển giữa disassembly view và mã giả C (pseudocode), giúp quan
sát logic trên ở cấp độ C rõ ràng hơn
Hình 1.12: Mã giả code của sub_401040
Trang 15Kết luận:
- Chương trình con này sử dụng một mảng ký tự (character array) được điền dữ liệu
thông qua lời gọi InternetReadFile Mảng này sau đó được so sánh từng byte một để phân tích cú pháp nhận xét HTML (HTML comment)
Question 5: Are there any network-based indicators for this program?
Dịch: Chương trình này có dấu hiệu nào liên quan đến mạng không?
Công cụ sử dụng: IDA Pro
- Sau khi xác định chức năng của sub_401000 và sub_401040, quay lại hàm main
và nhấn Space để chuyển sang chế độ Graph view Quan sát sơ đồ luồng tại main để nắm được mục đích tổng quát của chương trình/mã độc
Hình 1.13: Sơ đồ luồng từ hàm main
Trang 161) Kiểm tra kết nối Internet (sub_401000)
- Hàm main gọi sub_401000 để kiểm tra có kết nối Internet hay không
- Sau đó có lệnh so sánh với 0 (cmp …, 0) và một lệnh nhảy theo điều kiện (jnz):
• Nếu giá trị bằng 0 → không có kết nối → chương trình kết thúc
• Nếu giá trị khác 0 → có kết nối → chương trình tiếp tục (nhảy tới
loc_401148)
2) Mở trang web để lấy dữ liệu (sub_401040)
- Tại loc_401148, main gọi sub_401040 (khoảng địa chỉ 0x401040) Đây là hàm
thực hiện tải trang và chuẩn bị dữ liệu để phân tích
- Trong sub_401040:
• Gọi InternetOpenA với User-Agent "Internet Explorer 7.5/pma" → tạo
Internet handle (phiên làm việc mạng)
• Gọi InternetOpenUrlA với URL:
http://www.practicalmalwareanalysis.com/cc.htm → nếu thành công trả về
hFile (handle dùng để đọc dữ liệu)
- Kiểm tra hFile:
• Nếu hFile == 0 → mở URL thất bại → in thông báo "Error 2.1: Fail to OpenUrl" và đóng handle → hàm trả về thất bại
• Nếu hFile != 0 → mở URL thành công → chuyển sang bước đọc dữ liệu
3) Đọc dữ liệu và dò nhận xét HTML (sub_401040)
- Gọi InternetReadFile để đọc 512 byte (0x200) vào Buffer
- Kiểm tra bytesRead:
• Nếu bytesRead == 0 → in "Error 2.2: Fail to ReadFile" và đóng handle →
trả về thất bại
• Nếu bytesRead > 0 → có dữ liệu → tiếp tục xử lý Buffer
- Xử lý Buffer: chương trình so sánh tuần tự 4 byte đầu của Buffer với các giá trị
• Nếu không khớp, hàm trả về thất bại (không có command)
4) Hậu xử lý trong main
- Hàm main nhận giá trị trả về từ sub_401040 (ký tự đã parse, lưu tại [ebp+var_8])
- Nếu giá trị khác 0 (parsing thành công):
• Gọi hàm sub_40117F để in ra: Success: Parsed command is %c (với %c là ký
tự lấy từ comment HTML)
• Gọi Sleep(0xEA60) → tạm dừng 60000 ms (1 phút)
Sau đó chương trình kết thúc
Trang 17Phân tích động để chứng minh:
Công cụ : Wireshark
- Đầu tiên mở wireshark, chọn interface mạng tương ứng
Hình 1.14: Chọn interface tương ứng để bắt gói tin
- Sau đó mở và thực thi file mã độc Lab 6-2.exe
Hình 1.15: Thông báo hiện ra sau khi thực thi mã độc trên cmd
Nhận xét: Dòng Success: Internet Connection chứng tỏ sub_401000 trả về thành
công — tức chương trình phát hiện có kết nối Internet và không thoát sớm
=> Kết quả này cho phép main tiếp tục gọi sub_401040 để tải và phân tích trang web
(giai đoạn tiếp theo của phân tích)
Trang 18- Trong wireshark ta có thể dễ dàng bắt được request sau:
Hình 1.16: Bắt request gửi yêu cầu tới cc.html(1)
- Chuột phải vào request chọn follow tcp stream để xem lại toàn bộ luồng TCP (request/response) dưới dạng một chuỗi liên tục
Hình 1.17: Follow tcp stream request
Nhận xét: Ảnh cho thấy yêu cầu GET /cc.htm kèm header User-Agent: Internet
Explorer 7.5/pma tới www.practicalmalwareanalysis.com, và response HTTP/1.1
200 OK có thân bắt đầu bằng <! A Nội dung này cung cấp bằng chứng mạng rằng chương trình đã nhận được một HTML comment có ký tự A ở vị trí thứ năm
Trang 19Hình 1.18: CMD sau khi thực thi xong mã độc
Nhận xét: Ảnh chụp màn hình CMD (đã đính kèm) chứng minh rõ ràng chương
trình đã parse và in ký tự A, khớp hoàn toàn với hành vi đã phân tích tĩnh (so sánh từng byte của buffer)
Kết luận:
- Mục đích củ chương trình thực hiện trình tự hành vi mạng và xử lý dữ liệu như
sau: Đầu tiên kiểm tra kết nối Internet, nếu có thì mở một phiên HTTP (với Agent đặc trưng Internet Explorer 7.5/pma) tải trang :
User-http://www.practicalmalwareanalysis.com/cc.htm
- Nó đọc 512 byte đầu vào một bộ đệm, kiểm tra tuần tự bốn byte đầu để phát hiện
tiền tố nhận xét HTML <! , rồi lấy ký tự thứ năm trong comment làm parsed command Khi parsing thành công chương trình in Success: Parsed command is X
(với X là ký tự được trích) rồi tạm dừng 60 giây trước khi kết thúc
Trang 20PHÂN TÍCH VÀ TRẢ LỜI CÂU HỎI LAB 13.1 Question 1: Compare the strings in the malware (from the output of the
strings command) with the information available via dynamic analysis Based
on this comparison, which elements might be encoded?
Dịch: So sánh các chuỗi trong phần mềm độc hại (từ đầu ra của lệnh strings) với
thông tin có sẵn thông qua phân tích động Dựa trên so sánh này, những phần tử nào
có thể được mã hóa?
Công cụ: BinText, Wireshark, ApateDNS/InetSim
Trả lời:
a) Thực hiện quá trình phân tích tĩnh
- Để phân tích strings trong mã độc ta sử dụng công cụ BinText, tiến hành mở file thực thi trong BinText để quan sát
Hình 2.1: Kết quả BinText – các chuỗi DLL và API
- Trong Tệp thực thi chứa các chuỗi tên DLL (KERNEL32.dll, WS2_32.dll, WININET.dll) và các API mạng/với resource (FindResourceA, LoadResource, InternetOpenA, InternetReadFile, Sleep), cho thấy malware đọc resource nội bộ và thực hiện kết nối mạng (HTTP) Xác minh import table trong IDA/PEview để chứng thực các lời gọi API
Trang 21Hình 2.2: Kết quả của BinText-chuỗi User-Agent và mẫu URL
- Quan sát ta thấy được chuỗi:
http://%s/%s/: pattern định dạng URL, nghĩa là chương trình có thể dùng sprintf/wsprintf… để chèn domain và path vào chỗ %s Rất có khả năng là template
cho URL máy chủ (C2 / downloader)
Mozilla/4.0: user-agent dùng trong HTTP request (thông thường kèm
WININET/HttpOpenRequest hoặc InternetOpen/InternetOpenUrl) Việc thấy
user-agent + pattern URL mạnh chỉ ra chương trình gửi yêu cầu HTTP ra ngoài
- Tiếp tục tìm kiếm không phát hiện được địa chỉ đích (C2/URL) mà mã độc gửi yêu cầu tới; để xác định chính xác cần tiến hành phân tích động
b) Thực hiện quá trình phân tích động
- Trước khi chạy file thực thi, cần chạy các công cụ này trước để đảm bảo bắt được toàn bộ các hành động của mã độc, tránh bỏ sót bất kì chi tiết nào, từ đó giúp ích cho quá trình phân tích động
1 Trên máy Windows Server 2008: Bật Wireshark, chọn card mạng đang sử dụng
2 Trên máy Kali Linux: Khởi chạy công cụ InetSim để lắng nghe
Trang 22- Sau khi chuẩn bị xong các công cụ cần thiết, tạo snapshot đầy đủ, tiến hành khởi chạy file Lab13-01.exe và theo dõi hành vi của nó Trên giao diện wireshark bắt được các gói tin mạng được gửi qua lại Phân tích lưu lượng mạng, sẽ thấy mã độc phát tín hiệu (beacon) là một gói tin HTTP request GET đến máy Kali Linux đang chạy INetSim với nội dung HTTP như hình dưới đây:
Hình 2.3: Gói tin HTTP từ Wireshark – mã độc gửi yêu cầu GET
- Khi xem xét các chuỗi, nhận thấy có Mozilla/4.0 ở mục User-Agent đã xuất hiện ở bước phân tích tĩnh (strings), nhưng có chuỗi V0lOLUpXQlBQWlNY và www.practicalmalwareanalysis.com thì không xuất hiện Do đó, có thể giả định rằng các chuỗi này có thể đã được mã độc mã hóa/encode nhằm che giấu tên miền, hành
vi kết nối ra ngoài Internet, tránh bị phát hiện khi được phân tích tĩnh
- Ngoài ra, một số thành phần của gói tin beacon mạng, chẳng hạn như GET, HTTP/1.1, User-Agent, và Host có thể do các thư viện mạng của Windows cung cấp
Hình 2.4: Follow tcp stream request
Trang 23- Trong công cụ Wireshark, chọn gói tin HTTP, chọn Follow -> HTTP Stream, sẽ thấy được gói tin request từ máy chạy mã độc gửi đến máy Kali linux và phản hồi gửi về (200 OK) biểu thị việc kết nối giữa hai máy thành công
Hình 2.5: Log của InetSim trên máy chủ Kali Linux
- Trên máy Kali Linux, dừng công cụ INetSim, phân tích file log của công cụ này cũng thấy thông tin chi tiết về các request đến, gồm domain, path,…Còn lại trên các công cụ kiểm soát tiến trình thì không nhận thấy dấu hiệu bất thường
Kết luận:
- Như vậy thông qua việc tiến hành phân tích động, có thể rút ra kết luận mã độc có hành vi kết nối ra Internet, trùng khớp với các dự đoán đã đặt ra ở bước phân tích tĩnh Ngoài ra, còn phát hiện thêm các chuỗi domain, path lạ mà trong quá trình phân tích tĩnh chưa hề xuất hiện
Question 2: Use IDA Pro to look for potential encoding by searching for the
string xor What type of encoding do you find?
Dịch: Sử dụng IDA Pro để tìm kiếm mã hóa tiềm năng bằng cách tìm kiếm chuỗi
xor Tìm thấy loại mã hóa nào?
Công cụ: IDA Pro
Trang 24Trả lời:
- Sử dụng công cụ IDA Pro để reverse nhằm mục đích phân tích mã nguồn, tìm kiếm trong mã độc các bằng chứng về kỹ thuật mã hóa Xét tới kỹ thuật mã hóa dựa trên phép toán XOR khá phổ biến, được sử dụng nhiều
- Có hai kiểu XOR thường gặp trong assembly:
1 Zeroing xor: ví dụ xor eax, eax — đây là thủ thuật nhanh để gán 0 cho thanh
ghi Khi thấy kiểu này, thường không phải là mã hóa
2 Nonzeroing xor: ví dụ xor eax, 3Bh (xor với một immediate ≠ 0) — đây không xóa thanh ghi mà thay đổi giá trị theo một hằng Đây là kiểu xor thường dùng cho mã hóa/giải mã (XOR cipher) hoặc cho các phép biến đổi
dữ liệu khác
- Sau khi lọc bỏ các lệnh xor không phải dạng xóa về 0 (nonzeroing xor) trong IDA Pro, chúng ta thấy có 3 địa chỉ, trong số đó có hai địa chỉ 0x00402BE2 và 0x00402BE6 được xác định là mã của thư viện (library code) tức là những đoạn code chuẩn (runtime/CRT/library) mà chương trình dùng, vì vậy cửa sổ tìm kiếm không thể hiển thị tên hàm
Hình 2.6: Kết quả tìm kiếm lệnh xor
- Còn lại địa chỉ 0x004011B8 lệnh xor eax, 3Bh nằm trong hàm sub_401190: