Trong bài viết cuối cùng của tôi, Phân tích Malwares Sử dụng công cụ Microsoft , chúng tôi thu thập được một hình ảnh quá trình đổ với một biến thể Zeus nhiễm bên trong nó. In this article, we will go through the procedure for separating the ZeuS part from the other parts. Trong bài này, chúng tôi sẽ đi qua các thủ tục để tách các phần Zeus từ các bộ phận khác. With the extracted binary data, we can apply a disassembling process using IDA. Với chiết xuất dữ liệu nhị phân, chúng ta có thể áp dụng một quá trình tháo dỡ sử dụng IDA. You may wonder if it's possible to disassemble the image taken out from the process dump. Bạn có thể tự hỏi nếu nó có thể tháo rời các hình ảnh được lấy ra từ các bãi xử lý. In this case, the ZeuS variant was injecting a valid DLL file into the process, and somehow managed to hide the existence of the DLL so that it would not appear in the loaded modules list. Trong trường hợp này, các biến thể Zeus đã được tiêm một tập tin hợp lệ DLL vào quá trình này, và bằng cách nào đó quản lý để che giấu sự tồn tại của DLL để nó sẽ không xuất hiện trong danh sách các mô-đun được nạp. We can locate that image and can take it out using some tricks. Chúng ta có thể xác định vị trí mà hình ảnh và có thể lấy nó ra bằng cách sử dụng một số thủ thuật.
In the previous article, we found that the following APIs were hooked: Trong bài trước, chúng tôi thấy rằng các API sau đây đã được nối:
ws2_32.dll: ws2_32.dll:
send, WSASend, closesocket gửi, WSASend, closesocket
send, WSASend, closesocket gửi, WSASend, closesocket
wininet.dll: wininet.dll:
InternetCloseHandle, HttpSendRequestA, HttpQueryInfoA, InternetReadFile, InternetQueryDataAvailable, HttpSendRequestExW, InternetReadFileExA, HttpSendRequestW, HttpSendRequestExA InternetCloseHandle, HttpSendRequestA, HttpQueryInfoA, InternetReadFile, InternetQueryDataAvailable, HttpSendRequestExW, InternetReadFileExA, HttpSendRequestW, HttpSendRequestExA
InternetCloseHandle, HttpSendRequestA, HttpQueryInfoA, InternetReadFile, InternetQueryDataAvailable, HttpSendRequestExW, InternetReadFileExA, HttpSendRequestW, HttpSendRequestExA InternetCloseHandle, HttpSendRequestA, HttpQueryInfoA, InternetReadFile, InternetQueryDataAvailable, HttpSendRequestExW, InternetReadFileExA, HttpSendRequestW, HttpSendRequestExA
crypt32.dll: crypt32.dll:
PFXImportCertStore PFXImportCertStore
PFXImportCertStore PFXImportCertStore
user32.dll: user32.dll:
TranslateMessage, DefWindowProcW, NtUserBeginPaint, NtUserEndPaint, DefWindowProcA, GetClipboardData TranslateMessage, DefWindowProcW, NtUserBeginPaint, NtUserEndPaint, DefWindowProcA, GetClipboardData
TranslateMessage, DefWindowProcW, NtUserBeginPaint, NtUserEndPaint, DefWindowProcA, GetClipboardData TranslateMessage, DefWindowProcW, NtUserBeginPaint, NtUserEndPaint, DefWindowProcA, GetClipboardData
ntdll.dll: ntdll.dll:
ZwCreateThread, NtQueryDirectoryFile ZwCreateThread, NtQueryDirectoryFile
With the list of hooked APIs in mind, open the process dump file using Windbg. Then use the "u"(disassemble) command to check the first instructions they have. Với danh sách các API nối trong tâm trí, mở tập tin dump quá trình sử dụng WinDBG Sau đó sử dụng. Các "u" (tháo rời) lệnh để kiểm tra các hướng dẫn đầu tiên mà họ có. Below are some of the examples: Dưới đây là một số ví dụ: ZwCreateThread, NtQueryDirectoryFile ZwCreateThread, NtQueryDirectoryFile
0:000> u ws2_32!send L1 0:000> u ws2_32! Gửi L1
ws2_32!send: ws2_32 gửi!:
71ab428a e911990c8f jmp 00b7dba0 71ab428a e911990c8f JMP 00b7dba0
0:000> u ws2_32!WSASend L1 0:000> u ws2_32! WSASend L1
ws2_32!WSASend: ws2_32 WSASend!:
71ab6233 e985790c8f jmp 00b7dbbd 71ab6233 e985790c8f JMP 00b7dbbd
… ...
0:000> u crypt32!PFXImportCertStore L1 0:000> u crypt32! PFXImportCertStore L1
crypt32!PFXImportCertStore: crypt32 PFXImportCertStore!:
77aef748 e9f7e50889 jmp 00b7dd44 77aef748 e9f7e50889 JMP 00b7dd44
… ...
0:000> u ntdll!ZwCreateThread L1 0:000> u ntdll! ZwCreateThread L1
ntdll!ZwCreateThread: ntdll ZwCreateThread!:
7c90d7d2 e955962784 jmp 00b86e2c 7c90d7d2 e955962784 JMP 00b86e2c
0:000> u ntdll!NtQueryDirectoryFile L1 0:000> u ntdll! NtQueryDirectoryFile L1
ntdll!NtQueryDirectoryFile: ntdll NtQueryDirectoryFile!:
7c90df5e e927902784 jmp 00b86f8a 7c90df5e e927902784 00b86f8a JMP
0:000> !address 00b7dd44 0:000>! Địa chỉ 00b7dd44
00b70000 : 00b70000 - 00026000 00b70000: 00b70000 - 00026000
Type 00020000 MEM_PRIVATE Loại 00020000 MEM_PRIVATE
Protect 00000040 PAGE_EXECUTE_READWRITE Bảo vệ 00000040 PAGE_EXECUTE_READWRITE
State 00001000 MEM_COMMIT 00001000 Nhà nước MEM_COMMIT
Usage RegionUsageIsVAD Cách sử dụng RegionUsageIsVAD
The memory region starts from 0xb70000 and the size is 0x26000 bytes. Các khu vực bộ nhớ bắt đầu từ 0xb70000 và kích thước là 0x26000 byte. Let's just dump the start of the memory region using the "db" command, which dumps memory by bytes. Hãy chỉ đổ sự bắt đầu của khu vực bộ nhớ sử dụng "db" lệnh, mà bãi bộ nhớ bằng cách byte.The following command dumps the region of memory to the file " C:\Malwares\00b70000.bin". Các lệnh sau bãi khu vực bộ nhớ cho tập tin "C: \ Malwares \ 00b70000.bin".
0:000> .writemem C:\Malwares\00b70000.bin b70000 L26000 0:000>:. Writemem C \ Malwares \ 00b70000.bin L26000 b70000
Writing 26000 bytes............................................................................ Viết 26000 bytes ............................................... .............................
We open the file using IDA. Chúng tôi mở tập tin bằng cách sử dụng IDA. It seems to be successful, until we find that there is something wrong with the disassembly listing. Nó có vẻ là thành công, cho đến khi chúng tôi thấy rằng có cái gì đó sai trong danh sách tháo gỡ. First we get some error message dialog boxes: Trước tiên chúng ta nhận được một số hộp thoại thông báo lỗi thông báo:
Figure 1: Virtual Address Translation Error Hình 1: Virtual Address Translation Lỗi
We see that the imports table is empty: Chúng tôi thấy rằng các bảng nhập khẩu có sản phẩm nào:
Figure 2: Empty Imports Table Hình 2: Hết nhập khẩu Bảng
Even call instructions are referencing some invalid addresses: Ngay cả gọi là tham khảo hướng dẫn một số địa chỉ không hợp lệ: Figure 3: Call Referencing Invalid Region Hình 3: Liên hệ Khu vực tham chiếu không hợp lệ
We notice broken data referencing: Chúng tôi thông báo bị hỏng dữ liệu tham khảo:
This is happening because the base address for image loading is different from what is set in the PE header. Điều này xảy ra vì địa chỉ cơ sở cho tải hình ảnh khác với những gì được thiết lập trong tiêu đề PE. We can check the value of the image base defined in the PE header by looking at the top of the IDA disassembly listing. Chúng ta có thể kiểm tra giá trị của căn cứ hình ảnh được định nghĩa trong tiêu đề PE bằng cách nhìn vào phần trên của danh sách tháo gỡ IDA. In this case, the image base is set as 0x400000 as you can see from the following picture, but the image base when we dumped the image was actually 0xb70000. Trong trường hợp này, các cơ sở hình ảnh được thiết lập như 0x400000 như bạn có thể nhìn thấy từ các hình ảnh sau đây, nhưng các cơ sở hình ảnh khi chúng ta bán phá giá các hình ảnh đã thực sự 0xb70000.
Figure 4: Image Base is 0x400000 Hình 4: Hình ảnh Base là 0x400000
Will only fixing the image base solve the issues? Sẽ chỉ sửa ảnh cơ bản giải quyết các vấn đề? No. We need to take care of the section relocations. Số Chúng tôi cần phải chăm sóc của phần định vị lại. When the PE file is loaded into the process address space, it is not just copied exactly. Khi các tập tin PE được nạp vào không gian địa chỉ tiến trình, nó không chỉ là sao chép chính xác. The sections inside are located according to their virtual address. Các phần bên trong được đặt theo địa chỉ ảo của họ. Each section has their position and size in the physical file, and also has a virtual address region to be mapped. Mỗi phần có vị trí và kích thước trong các file vật lý, và cũng có một khu vực địa chỉ ảo để ánh xạ. All the information is inside the PE file header. Tất cả các thông tin được bên trong phần đầu tập tin PE.
We used the pefile Python module from Ero Carrera to achieve the PE file manipulation. Chúng tôi sử dụng các pefile mô-đun Python từ Ero Carrera để đạt được các thao tác file PE. Here's the source code for the script that we used: Dưới đây là các mã nguồn cho các kịch bản mà chúng tôi sử dụng:
import pefile nhập khẩu pefile
import sys sys nhập khẩu
filename = sys.argv[1] tên tập tin sys.argv = [1]
out_filename = sys.argv[2] out_filename sys.argv = [2]
rebase_address = int(sys.argv[3],16) rebase_address = int (sys.argv [3], 16)
pe = pefile.PE(filename) pe = pefile.PE (filename)
print "Rebasing from ",hex(pe.OPTIONAL_HEADER.ImageBase),"to",hex(rebase_address) in "Rebasing từ", hex (pe.OPTIONAL_HEADER.ImageBase), "tới",) hex (rebase_address
pe.OPTIONAL_HEADER.ImageBase = rebase_address pe.OPTIONAL_HEADER.ImageBase = rebase_address
for section in pe.sections: cho phần trong pe.sections:
section.PointerToRawData = section.VirtualAddress section.PointerToRawData = section.VirtualAddress
pe.write(out_filename) pe.write (out_filename)
c:\python26\python Rebase.py 00b70000.bin 00b70000_rebased.bin 0xb70000 c: \ python26 \ python Rebase.py 00b70000.bin 00b70000_rebased.bin 0xb70000
This command will re-base the image base to 0xb70000 and will also correct section location information by setting PointerToRawData to be same as the VirtualAddress value. Lệnh này sẽ tái cơ sở cơ sở hình ảnh để 0xb70000 và cũng sẽ chính xác thông tin vị trí phần bằng cách thiết lập PointerToRawData để được giống như giá trị VirtualAddress. PointerToRawData is the offset in the file where the section starts. PointerToRawData được bù đắp trong các tập tin mà phần bắt đầu. We dumped it from the memory and it should be same as VirtualAddress. Chúng tôi đổ từ bộ nhớ và nó phải là giống như VirtualAddress. After running the script, open up the re-based image "00b70000_rebased.bin" using IDA. Sau khi chạy kịch bản, mở hình ảnh lại dựa trên "00b70000_rebased.bin" bằng cách sử dụng IDA.
Now we have a valid and good imports table: Bây giờ chúng tôi có một bảng nhập khẩu hợp lệ và tốt:
Figure 5: Valid Imports Table Hình 5: Có giá trị nhập khẩu Bảng
Figure 6: Call Instruction Referencing Valid APIs Hình 6: Liên hợp lệ Hướng dẫn tham khảo API
Figure 7: Valid String Data Hình 7: Dữ liệu String hợp lệ
Conclusion Kết luận
Retrieving injected modules and making it valid for disassembling is possible with a few Windbg tricks and python scripts. Lấy mô-đun tiêm và làm cho nó giá trị là có thể tháo rời với một vài thủ thuật WinDBG và kịch bản python. Tracing malicious code inside a debugger doesn't compare to having it inside a full-blown disassembler. Truy tìm các mã độc bên trong một trình gỡ rối không so sánh để có nó bên trong một bộ phận phân tách toàn diện. The script presented in this article can be applied to any injected modules in the Windows environment. Các kịch bản trình bày trong bài viết này có thể được áp dụng cho bất kỳ phần tiêm vào trong môi trường Windows.Next time we are going to talk about automated scripts that will do all the jobs that we have done with a single command. Tiếp theo thời gian chúng ta sẽ nói chuyện kịch bản về tự động sẽ làm tất cả những công việc mà chúng tôi đã thực hiện với một lệnh đơn.
Thanks and have a great reversing! Cảm ơn và có một lớn đảo chiều!
0 nhận xét:
Đăng nhận xét