Notification texts go here Contact Us Buy Now!

[Write-up] Practical Malware Analysis | Part 2 - Chapter 5 - Lab 5-1

Practical Malware Analysis

CHAPTER 5 - IDA PRO

Write up Lab5-1


Analyze the malware found in the file Lab05-01.dll using only IDA Pro. The goal of this lab is to give you hands-on experience with IDA Pro. If you’ve already worked with IDA Pro, you may choose to ignore these questions and focus on reverse-engineering the malware.

Phân tích mã độc được tìm thấy trong tệp Lab05-01.dll chỉ bằng IDA Pro. Mục tiêu của lab này là cung cấp cho bạn trải nghiệm thực tế với IDA Pro. Nếu bạn đã làm việc với IDA Pro, bạn có thể chọn bỏ qua những câu hỏi này và tập trung vào kỹ thuật dịch ngược mã độc.

Lab05-01
Questions

1. What is the address of DllMain?
(Địa chỉ của DllMain là gì?)

Khởi động IDA Pro và mở tệp Lab05.dll, IDA Pro đã phát hiện nó có định dạng PE và kiến trúc Intel x86, nhấn OK để tiếp tục.


Sau khi file đã disassemble, tại cửa sổ Functions tìm đến hàm DllMain(x,x,x) đồng thời trong cửa sổ IDA View-A ta biết được địa chỉ hàm là 100D02E.


Note:
  • Khi ta tải một file thực thi, IDA Pro sẽ cố gắng xác định định dạng file và kiến trúc vi xử lý mà file được sinh ra để phục vụ. Ở đây file Lab05.dll được phát hiện có định dạng PE và kiến trúc Intel x86. Trừ khi ta thực hiện phân tích một mã độc chạy trên thiết bị điện thoại chẳng hạn (hoạt động trên kiến trúc vi xử lý khác), ta thường không phải thay đổi thông tin hệ vi xử lý thường xuyên.
  • Trong IDAPro để hiện địa chỉ CODE ở giao diện graph thực hiện như sau: OptionsGeneral tích chọn Line Prefixes.
  • Phím tắt giữa chế độ đồ họa và chế độ text là phím 'Space'.

2. Use the Imports window to browse to gethostbyname. Where is the import located?
(Sử dụng cửa sổ Imports để duyệt đến gethostbyname. Địa chỉ nhập nằm ở đâu?)

Đầu tiên, chúng ta hãy xem hàm gethostbyname.


Đây là chức năng lấy thông tin về trang web mà chúng ta muốn truy cập. Thông tin đó bao gồm IP, v.v. 

Tiếp theo trong IDA Pro, trong cửa sổ Imports, nhấn Alt+T để mở hộp thoại tìm kiếm 'gethostbyname'


Double click hàm gethostbyname trong cửa sổ Imports lập tức IDA sẽ tự động chuyển sang cửa sổ IDA View-A để trỏ đến địa chỉ của hàm, kết quả ta có địa chỉ 100163CC trong .idata.


3. How many functions call gethostbyname?
(Hàm gọi gethostbyname có bao nhiêu chức năng?)

Trong cửa sổ IDA View-A đặt dấu nhắc tại vị trí của hàm gethostbyname, tiếp theo từ Menu Jump  List cross references to... (phím tắt Ctrl+X).


Hoặc 
right click tại vị trí của hàm gethostbyname.


Hộp thoai xrefs to gethostbyname sẽ cho biết số lượng hàm gọi.


Quan sát ở cuối cửa sổ sẽ thấy “Line 1 of 18” có 18 dòng nhưng thực tế IDA Pro 8.3 tính toán tham chiếu chéo hai lần, một lần cho loại p (tham chiếu đang được gọi - called) và một lần cho loại r (tham chiếu đang được đọc - read vì nó là call dword ptr [...] để nhập, CPU phải đọc nội dung nhập rồi gọi vào đó). Ở đây ta chỉ quan tâm đến loại p, click vào tab Type để sắp xếp lại tham chiếu chéo sẽ có 9 tham chiếu và hàm gethostbyname được gọi tổng cộng bằng 5 hàm riêng biệt.


Chuột phải vị trí hàm gethostbyname chọn Xrefs graph to... để xem thông tin các liên kết chéo với hàm gethostbyname.



4. Focusing on the call to gethostbyname located at 0x10001757, can you fig-ure out which DNS request will be made?
(Tập trung vào lệnh gọi tới gethostbyname có địa chỉ 0x10001757, bạn có thể biết yêu cầu DNS nào sẽ được thực hiện không?)

Tại Tab Jump  Jump to address... (phím tắt G), nhập 0x10001757.


IDA sẽ đưa đến vị trí của gethostbyname.


Hãy quan sát đoạn mã này:


Có thể hiểu đoạn mã này như sau: Lệnh mov sẽ chuyển giá trị  off_10019040 vào thanh ghi eax trước khi được cộng 0Dh (tương ứng 13 trong hệ thập phân) vào thanh ghi eax. Như vậy ta phải xác định xem giá trị off_10019040 có trỏ về DNS nào không.

Nhấn phím G và nhập off_10019040 để xem:



Như thấy nó trỏ tới một chuỗi [This is RDO]pics.practicalmalwareanalysis.com. Tuy nhiên như đã nói nó đã được công  0Dh (13 byte) trước khi thực hiện lệnh đẩy push vì vậy mà   nếu đẩy 13 byte tương ứng với [This is RDO] sẽ chỉ còn lại: 
pics.praticalmalwareanalysis.com

5. How many local variables has IDA Pro recognized for the subroutine at 0x10001656?
(IDA Pro đã nhận dạng được bao nhiêu biến cục bộ cho chương trình con tại 0x10001656?)

Note: 
  •  Các biến cục bộ được IDA gắn nhãn tương ứng với giá trị âm.
  •  Các tham số được IDA gắn nhãn và tham chiếu với giá trị dương.
Nhấn phím G tìm đến địa chỉ 0x10001656 để phân tích sub_10001656. Chúng ta thấy phần khoanh đỏ số 1 chính là bắt đầu của hàm sub_10001656, phần khoanh đỏ số 3 chính là số lượng các biến cục bộ, có 23 biến không bao gồm lpThreadParameter ở dòng cuối cùng vì nó là tham số đến. Tùy phiên bản thương mại hoặc bản miễn phí sẽ phát hiện số lượng hơi khác nhau đôi chút.


6. How many parameters has IDA Pro recognized for the subroutine at 0x10001656?
(IDA Pro đã nhận dạng được bao nhiêu tham số cho chương trình con tại 0x10001656)

Vị trí  khoanh số 2 trong hình ở câu hỏi 5 cho biết tham số đến là lpThreadParameter và khoanh vị trí số 4 được nhận dạng tức là dword ptr 4. Như vậy IDA nhận ra 1 tham số trong subprocess.

7. Use the Strings window to locate the string \cmd.exe /c in the disassembly. Where is it located?
(Sử dụng cửa sổ Strings để định vị chuỗi \cmd.exe /c trong quá trình disassembly. Nó nằm ở đâu?)

Trong Tab View  → Open subviews → Strings ( phím tắt Shitf+F12) để mở cửa sổ Strings

Nhấn Alt+T để mở hộp thoại tìm kiếm strings: \cmd.exe /


Hoặc Ctrl+F nhập \cmd.exe / Enter.


kết quả cần tìm là 0x10095B34.

8. What is happening in the area of code that references \cmd.exe /c? (Điều gì đang xảy ra trong vùng mã tham chiếu \cmd.exe /c?)

Trong cửa sổ Strings nhấn vào chuỗi " \\cmd.exe /c " và double click vào chuỗi đó. Hàm sẽ mở ở chế độ xem văn bản IDA View-A, như hiển thị ở câu hỏi 7.

Trong dòng chứa "\\cmd.exe /c", double click vào địa chỉ ở bên phải "XREF" (vị trí mũi tên ↑ ) trong hình ảnh bên dưới.


Sau khi double click vào vị trí mũi tên ↑, IDA Pro sẽ chuyển đến vị trí chi tiết của hàm, tiếp theo nhấn phím 'Space' để chuyển sang chế độ xem biểu đồ. Quan sát thấy rằng \\cmd.exe /c được sử dụng trong thủ tục nhỏ bên trái.


Kéo chế độ xem biểu đồ xuống để xem các chương trình con trước nó. Kéo xuống đến khung thứ 4, bạn sẽ thấy văn bản bắt đầu bằng "Hi, Master", như hiển thị bên dưới.


Double click vào aHiMasterDDDD để hiển thị đầy đủ. Mục đích của mã độc được nêu rõ ràng trong phần khoanh đỏ ở hình dưới. Nó bắt đầu một phiên shell từ xa.


9. In the same area, at 0x100101C8, it looks like dword_1008E5C4 is a global variable that helps decide which path to take. How does the malware set dword_1008E5C4? (Hint: Use dword_1008E5C4’s cross-references.)
(Trong cùng một khu vực, tại 0x100101C8, có vẻ như dword_1008E5C4 là một biến toàn cục giúp quyết định nên chọn đường dẫn nào. Vậy mã độc đặt địa chỉ dword_1008E5C4 như thế nào? (Gợi ý: Sử dụng tham chiếu chéo của dword_1008E5C4.))

Nhấn phím 'G' để tìm kiếm địa chỉ 0x100101C8. Được chuyển đến cmp dword_1008E5C4, ebx lệnh này có nghĩa là sẽ so sánh ebx với biến toàn cục.


Tại vị trí dword_1008E5C4 right click chọn Jump to xref to operand... (phím tắt X).



Chúng ta thấy rằng EAX được chuyển vào dword_1008E5C4EAX là giá trị trả về từ lệnh gọi hàm được thực hiện trong lệnh trước đó là lệnh call sub_1003695.


Do đó, chúng ta cần xác định hàm đó trả về cái gì?  Để làm như vậy, chúng ta kiểm tra sub_10003695 bằng cách double click vào nó và xem xét quá trình disassembly.


Quan sát hình trên nhận thấy hàm sub_10003695 chứa thông tin các lệnh sau như sau:
  • Lệnh call ds:GetVersionExA → kiểm tra thông tin phiên bản của Hệ điều hành dưới dạng giá trị.
  • Lệnh xor eax, eax →  đặt eax = 0.
  • Lệnh cmp [eb+VersionInformation.dwPlatformId], 2 → so sánh dwPlatformId nền tảng của Hệ điều hành với giá trị 2.
Note: Theo tài liệu của Microsoft thì giá trị dwPlatformId là 2 nếu version Windows là NT hoặc các verion lớn hơn NT.



  • Lệnh setz al →  Nếu dwPlatformId=2 mà đúng thì giá trị trả về là 0 (cờ nhớ CF=0) và cờ zero =1 (ZF = 1). Lúc này setz AL =1 (AL lại là 8 bit thấp nhất của eaxeax đã được đặt = 0 ở lệnh XOR trước đó.
Kết luận đây chỉ là một cách kiểm tra đơn giản để đảm bảo rằng Hệ điều hành là Windows NT hoặc version mới hơn và  biến toàn cục thường sẽ được đặt thành 1.

10. A few hundred lines into the subroutine at 0x1000FF58, a series of com-parisons use memcmp to compare strings. What happens if the string compar-ison to robotwork is successful (when memcmp returns 0)?
(Vài trăm dòng lệnh trong chương trình con tại 0x1000FF58, một loạt các phép so sánh sử dụng memcmp để so sánh các chuỗi. Điều gì xảy ra nếu chuỗi so sánh với robotwork thành công (khi memcmp trả về 0)?

Nhấn 'G' và tìm tới chương trình con tại 0x1000FF58, kéo lên trên một chút để xem các biến và tham số được chương tình con nhận diện.


Sau khi di chuyển, chúng ta cần tìm Robotwork, vào cửa sổ Strings bằng (phím tắt Shift+F12) (lưu ý do một số dòng máy tính có thêm hàng phím chức năng nên thay vì nhấn Shift+F12 có thể cần phải nhấn đồng thời Fn+shift+f12) và tìm kiếm chuỗi bằng Alt+T.


Tiếp theo click vào vị trí của 'robotwork' IDA  sẽ chuyển sang vị trí trong cửa sổ IDA View-A. Right click tại vị trí của robotwork  chọn List cross referencess to... ( Phím tắt Ctrl+X).


Tên phần là xdoors_d và chúng ta suy đoán rằng nó có thể được tạo bởi người viết ra mã độc. Xét thấy có các biến liên quan đến chuỗi như 'robotwork', .., v.v. thì rất có thể nó nằm trong vùng .data.

Hãy đặt con trỏ vào phần offset, aRobotwork chọn OK.


Bạn có thể thấy phần memcmp được thấy trong vấn đề. Ngoài ra, địa chỉ trong câu hỏi là 1000FF58, nhưng lý do nó không xuất hiện ngay khi tôi tìm kiếm là vì nó quá xa địa chỉ. 


Hãy phân tích đoạn mã này:


Hàm jnz short loc_10010468: Nếu giá trị khác 0 (khác chuỗi 'robotwork') thì nhảy tới địa chỉ  10010468. Nếu giá trị bằng 0 (giống chuỗi 'robotwork') thì hàm gọi call sub_100052A2 sẽ được gọi

Như vậy, nếu có chuỗi 'robotwork' xuất hiện thì chúng ta sẽ so sánh và nếu đúng thì nó sẽ là 100052A2, double click vào hàm sub_100052A2 để xem chi tiết.


IDA sẽ đưa đến vị trí chi tiết của hàm là trong phần .text.


Có vẻ như một khóa đăng ký cụ thể đang được mở (vị trí khung khoanh đỏ). 

Nếu mở thành công, giá trị khóa có tên 'WorkTime' sẽ được truy xuất bằng hàm RegQueryValue. Nếu giá trị khóa 'WorkTime' có giá trị là 30 giây, hãy lấy dữ liệu được lưu trữ trong thời gian làm việc và 30 rồi sử dụng hàm atoi để chuyển chuỗi thành số nguyên. Thay đổi 30 giây và sử dụng sprintf để nhập chuỗi [Robot_WorkTime: ] %d. Trong %d này, thêm 30 giây được chuyển đổi thành atoi.


Nếu bạn đặt con trỏ vào hàm call 100038EE, bạn có thể xem chi tiết về chức năng. Xét rằng đó là một socket s, có thể giả định rằng có thứ gì đó đang được gửi hoặc nhận qua mạng.


Vì vậy, tôi nghĩ hàm này là hàm đọc truy vấn thời gian làm việc và giá trị được lưu trữ trong Registry, kết hợp nó thành một chuỗi và truyền kết quả cho hacker qua mạng.

11. What does the export PSLIST do
(PSLIST xuất có tác dụng gì?)

Trong cửa sổ Exports.


Double click dòng PLIST, vị trí của nó sẽ xuất hiện trong cửa sổ IDA View-A.


Nhấn 'Space' để xem chế độ đồ họa.


Đặt con trỏ vào vị trí của hàm sub_10003C3 để thêm thông chi tiết tham chiếu chéo của hàm đó.


Tiếp theo double click vào sub_10003C3 để nhảy đến vị trí của hàm.


Nhấn 'Space' để xem chế độ đồ họa.


Khi vào trong, nó đặt 1 trong 1008E5BC và gọi hàm sub_100036C3. Phiên bản hệ điều hành được kiểm tra bằng chức năng getversion như ở câu trả lời số 9 chúng ta đã đề cập đến: OSVERSIONINFOA (winnt.h) - Win32 apps | Microsoft Learn
Vì vậy hãy thay đổi chức năng này để nó trông đẹp hơn. Đặt con trỏ lên hàm sub_100036C3 và nhấn N hoặc Nhấp chuột phảiRename đổi thành OS_Version_sub_100036C3



Lúc này tên hàm đã thay đổi thành OS_Version_sub_100036C3 và chúng ta sẽ xem xét hàm dành cho sub_10006518 bên dưới. Có thể giả định rằng chức năng của sub_10006518 là in danh sách quy trình. Đổi tên sub_10006518 thành PRINT_PSLIST_sub_10006518.



Chức năng này ban đầu kiểm tra phiên bản hệ điều hành và in danh sách quy trình. Tôi đã kiểm tra các hàm bên dưới và thấy rằng chúng giống các hàm xuất ra PSLIST, vì vậy tôi đã đổi tên chúng.


12. Use the graph mode to graph the cross-references from sub_10004E79.Which API functions could be called by entering this function? Based on the API functions alone, what could you rename this function?
(Sử dụng chế độ biểu đồ để vẽ biểu đồ tham chiếu chéo từ sub_10004E79. Những hàm API nào có thể được gọi bằng cách nhập hàm này? Chỉ dựa vào các hàm API, bạn có thể đổi tên hàm này thành gì?)

Bằng cách sử dụng 'G' để đi đến địa chỉ quan tâm (trong trường hợp này là sub_10004E79).


Sau đó từ Menu ViewGraphsXRefs From để xem một số hàm API trong hàm này.



Dựa trên điều này, có thể suy ra rằng nhiều khả năng Mã định danh ngôn ngữ mặc định của hệ thống sẽ được gửi qua network socket và do đó có thể đặt tên hàm này là LanguageIdentifier_Send.

13. How many Windows API functions does DllMain call directly? How many at a depth of 2 ?(DllMain gọi trực tiếp bao nhiêu hàm Windows API? Có bao nhiêu ở độ sâu 2 ?)

Tìm lại địa chỉ hàm DllMain(x,x,x) sau đó đặt dấu nhấp chọn Hàm _DllMain@12:


Tiếp theo từ Menu View → Graphs → User xrefs chart.


Hộp thoại User xrefs chart xuất hiện, tiến hành điều chỉnh như vùng khoanh vàng và nhấn OK để thực hiện.

Note: 
Địa chỉ bắt đầu và kết thúc phải tương ứng với điểm bắt đầu của DllMain - cụ thể là 0x1000D02E. Vì tôi chỉ quan tâm đến các tham chiếu chéo từ DllMain nên chúng tôi chọn độ sâu đệ quy là 1 để chỉ hiển thị các hàm mà DllMain gọi trực tiếp.


Kết quả hiển thị biểu đồ.


Hàm DLLMain gọi 4 hàm Windows API CreateThreadstrncpy, strlen_strnicmp)

Nếu chúng ta mở rộng điều này lên độ sâu 2, biểu đồ sẽ tăng kích thước và sẽ cực kỳ chi tiết.


Ở độ sâu 2, DLLMain gọi tổng số 33 hàm API bao gồm Sleep và nhiều chức năng liên quan đến mạng như socket, kết nối, recv và gửi. Ảnh chụp màn hình bên dưới hiển thị tất cả các hàm (hàm API có màu hồng) với DLLMain được khoanh màu đỏ để tham khảo.


Click từng hình ở dưới để xem với chế độ gốc thì có 33 hàm tất cả (đã đánh số sẵn từ trái qua phải).




14. At 0x10001358, there is a call to Sleep (an API function that takes one parameter containing the number of milliseconds to sleep). Looking backward through the code, how long will the program sleep if this code executes?
(Tại 0x10001358, có lệnh gọi tới chế độ Sleep (một hàm API nhận một tham số chứa số mili giây để ngủ). Nhìn ngược lại đoạn mã, chương trình sẽ sleep trong bao lâu nếu đoạn mã này thực thi?)

Quay trở lại với lệnh gọi chế độ ngủ, chúng ta có thể thấy EAX được nhân với 1000 trước khi được đẩy vào ngăn xếp và được gọi. Điều này khớp với tham chiếu đến mili giây, trong đó có 1000 mili giây trong một giây.

Nhấn G để đến địa chỉ 0x10001358 


Quan sát vào đoạn mã sau:


Phân tích đoạn mã ở hình trên: 

  • call ds: Sleep - Lệnh này sẽ thực thi chế độ ngủ và nó lấy tham số là mili giây để ngủ đồng thời nó được đẩy lên ngăn xếp dưới dạng EAX bằng lệnh push eax ở địa chỉ 0x10001357.
  • imul eax, 3E8h -  Lệnh này sẽ nhân EAX với 0x3E8 (hoặc 1000 ở dạng thập phân), điều này cho chúng ta biết rằng kết quả của lệnh gọi atoi trước đó được nhân với 1000 để có số giây ngủ.
  • mov eax, off_10019020 - Lệnh này sẽ chuyển off_10019020 vào EAX. Để xem chi tiết về phần bù hãy nhấn đúp chuột vào off_10019020:


Kết quả đây là tham chiếu đến chuỗi [This is CTI]30 .

  • add eax, 0xD - Lệnh này thêm EAX vào phần bù, khiến EAX trỏ đến 30 cho lệnh gọi atoi , chuỗi này sẽ chuyển chuỗi 30 thành số 30. Lấy 30*1000 = 30.000 mili giây (30 giây), đó là khoảng thời gian chương trình này sẽ ngủ nếu các chuỗi giống nhau khi thực thi.
Kết luận: Chương trình sẽ ngủ 30 giây nếu các chuỗi giống nhau thực thi.

15. At 0x10001701 is a call to socket. What are the three parameters?
(Tại 0x10001701 là lệnh gọi tới socket. Ba thông số là gì?)

Nhấn G để nhảy tới địa chỉ 0x10001701, có thể thấy một cuộc gọi đến socket có 3 tham số (af, typeprotocol), tất cả đều được đẩy vào ngăn xếp trước cuộc gọi.


16. Using the MSDN page for socket and the named symbolic constants func-tionality in IDA Pro, can you make the parameters more meaningful? What are the parameters after you apply changes?
(Sử dụng trang MSDN cho socket và các hằng ký hiệu được đặt tên trong IDA Pro, bạn có thể làm cho các tham số có ý nghĩa hơn không? Các thông số sau khi bạn áp dụng thay đổi là gì?)

Đầu tiên hãy truy cập Chức năng socket MSDN để tìm hiểu: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket




Bằng cách xem xét chức năng socket MSDN, chúng ta có thể tìm thấy những con số này tương quan với nhau.

Tiếp theo trong IDA Pro, đưa vị trí con trỏ chuột tại vị trí của số 6 và right click để chọn Symbolic constantUse standard symbolic constant.



Hộp thoại Please choose a symbol hiện ra với rất nhiều socket function.


Nhấn Ctrl+F để xuất hiện khung tìm kiếm ở phía dưới, tiếp theo hãy tìm: 'IPPROTO_TCP' (tương ứng với 6 trong MSDN socket) và double click nó để sửa đổi.


Kết quả số 6 đã được sửa thành IPPROTO_TCP.


Thực hiện tương tự với các số 2 và 1 ta sẽ có:


Như vậy là các cài đặt đã được thay đổi để dễ xem hơn.

17. Search for usage of the in instruction (opcode 0xED). This instruction is used with a magic string VMXh to perform VMware detection. Is that in use in this malware? Using the cross-references to the function that executes the in instruction, is there further evidence of VMware detection?
(Tìm kiếm cách sử dụng lệnh trong (opcode 0xED). Lệnh này được sử dụng với chuỗi ma thuật VMXh để thực hiện phát hiện VMware. Điều đó có được sử dụng trong mã độc này không? Bằng cách sử dụng các tham chiếu chéo tới hàm thực thi lệnh in, có thêm bằng chứng nào về việc phát hiện VMware không?)

Trong cửa sổ IDA View-A, nhấn Alt+B để mở hộp thoại tìm kiếm Binary search:


Cửa số Occurences of binanry: ED xuất hiện.


Nhấn Ctrl+F để mở khung tìm kiếm lênh in.


Chọn in eax, dx và nhấn đúp vào nó để xem thông tin chi tiết:


Tại 0x100061C7 lệnh mov di chuyển 0x564D5868 vào EAX. Nhấp chuột phải vào vị trí 564D5868h (phím tắt R) để chuyển đổi sang dạng chuỗi ASCII 'VMXh' , xác nhận rằng đoạn mã này là một kỹ thuật chống máy ảo đang được phần mềm độc hại sử dụng. (Chúng ta sẽ thảo luận chi tiết cụ thể) của kỹ thuật này và các kỹ thuật khác trong Chương 17).


Sau khi nhấn phím tắt R để chuyển đổi:


Để xác nhận việc chống máy ảo, chúng ta thực hiện tham chiếu chéo như sau:
  • Cuộn lên đến vị trí bắt đầu của hàm đó là sub_10006196.
  • Nhấn Ctrl+X để mở tham chiếu chéo, chọn tham chiếu đầu tiên và nhấp vào OK.

Kết quả chi tiết cho thấy "Found Virtual Machine, Install Cancel." (đóng khung xanh) cũng xuất hiện trong văn bản của hàm, xác nhận dự đoán của chúng ta là đúng.



18. Jump your cursor to 0x1001D988. What do you find? (Chuyển con trỏ tới 0x1001D988. Bạn tìm thấy gì?)

Nhấn phím 'G' để nhảy tới địa chỉ 0x1001D988.


Chúng ta sẽ tìm thấy một loạt chuỗi ngẫu nhiên không có ý nghĩa.


19. If you have the IDA Python plug-in installed (included with the com-mercial version of IDA Pro), run Lab05-01.py, an IDA Pro Python script provided with the malware for this book. (Make sure the cursor is at 0x1001D988.) What happens after you run the script?
(Nếu bạn đã cài đặt plug-in IDA Python (có trong phiên bản thương mại của IDA Pro), hãy chạy Lab05-01.py, tập lệnh IDA Pro Python được cung cấp cùng với phần mềm độc hại cho cuốn sách này. (Đảm bảo con trỏ ở 0x1001D988.) Điều gì xảy ra sau khi bạn chạy tập lệnh?)


Mình chưa cài đặt phiên bản thương mại do đó để chạy được đoạn scrit python sẽ cần chuyển đổi sang định dạng IDC và save vào cùng thư mục.
#include<idc.idc>
static main()
{
auto ea=ScreenEA(),b,i,decoded_byte;
for(i=0x0;i<0x50;i++)
{
b=Byte(ea+i);
decoded_byte=b*0x55;
PatchByte(ea+i,decoded_byte);
}
}
Tiếp theo tìm đến địa chỉ 0x1001D988 và đặt con trỏ tại vị trí đó, rồi mở file script IDC từ Menu File → Script file... tìm đến file lab05.idc. IDA Pro sẽ thực thi file này và trả về kết quả như sau:


Sau khi chạy tập lệnh, nó sẽ trở thành một chuỗi văn bản thuần túy.
 
20. With the cursor in the same location, how do you turn this data into a single ASCII string? (Với con trỏ ở cùng một vị trí, làm cách nào để biến dữ liệu này thành một chuỗi ASCII đơn?)

Đặt vị trí con trỏ tại địa chỉ 0x1001D988 và nhấn phím 'A' để chuyển đổi sang dạng ASCII, ta được dãy ký tự sau: '-1::',27h,'u<&u!=<&u746>1::',27h,'yu&!',27h,'<;2u106:101u3:',27h,'u'


Thực hiện tương tự với các địa chỉ khác cho đến khi không còn khoảng trống ta được các ký tự như sau: 

'46!<649u'
'49"4',27h,'0u'
';49,&<&u'
'47uo|dgfa',0.

Nhận thấy những ký tự ASCII này đã được encode để hiểu ý nghĩa các ký tự này chúng ta sẽ decode nó.

Chúng ta thấy rằng nó chứa mã thực thi với thao tác XOR sử dụng 0x55 làm khóa. Đưa toàn bộ vào CyberChef và xóa các khoảng cách không cần thiết ta sẽ được kết quả sau:

-1::'u<&u!=<&u746>1::'yu&!''<;2u106:101u3:'u'46!<649u49"4'0u49,&<&u47uo|dgfa

Tương đương với chuỗi decode:

xdoor is this backdoor, strring decoded for ractical alware alysis ab :)1234

https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'Hex','string':'0x55'%7D,'Standard',true)&input=LTE6Oid1PCZ1IT08JnU3NDY%2BMTo6J3l1JiEnJzw7MnUxMDY6MTAxdTM6J3UnNDYhPDY0OXU0OSI0JzB1NDksJjwmdTQ3dW98ZGdmYQ
21. Open the script with a text editor. How does it work? (Mở tập lệnh bằng trình soạn thảo văn bản. Làm thế nào nó hoạt động?)

Sử dụng trình soạn thảo Notepad++ mở file script python:

sea = ScreenEA()

for i in range(0x00,0x50):
        b = Byte(sea+i)
        decoded_byte = b ^ 0x55
        PatchByte(sea+i,decoded_byte)
Tập lệnh Lab05-01.py sử dụng chức năng “ScreenEA” với hàm ScreenEA để lấy vị trí hiện tại của con trỏ trong IDA. Sau đó, nó lặp qua 0x50 byte liên tiếp và sử dụng XOR để so sánh từng byte với 0x55, sau đó sử dụng PatchByte để hợp nhất tất cả chúng lại với nhau trên một dòng.

Kết thúc Lab05-01.dll

Đăng nhận xét

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.