Trình giải mã python 3.10

Các chương trình truyền thống được viết bằng ngôn ngữ lập trình python được phân phối dưới dạng mã nguồn và trình thông dịch python được sử dụng để chạy chúng. Điều này thật dễ dàng nếu một người chạy mã python của riêng họ; . Để giải quyết vấn đề đó, một vài dự án đã được tạo để có thể gói chương trình python với tất cả các phụ thuộc của nó vào một tệp thực thi. Portable Executable (PE) trên Windows và Executable and Linkable Format (ELF) trên Linux/Unix

Phần mềm độc hại Python cũng được phân phối dưới dạng các tệp thực thi được đóng gói như vậy. Và nếu chúng ta nói về phần mềm độc hại, câu hỏi luôn xuất hiện, "làm cách nào chúng tôi có thể giải nén và dịch ngược phần mềm độc hại để xem mã nguồn python của nó?" . Nhưng kể từ đó, các phiên bản python mới đã ra đời và kỹ thuật giải nén đã thay đổi

Trong bài đăng trên blog này, chúng ta sẽ đi qua các chủ đề sau

  • đóng gói
  • Giải nén và dịch ngược trên Windows bên dưới phiên bản python 3. 9
  • Giải nén và dịch ngược trên Linux sau phiên bản python 3. 9

Sự khác biệt giữa các phiên bản python cũ hơn và mới hơn rất quan trọng vì rất nhiều thay đổi sau python 3. 9, cả về cách tạo mã byte python và cách (và liệu) mã nguồn có thể được khôi phục hay không

Nền tảng bị ảnh hưởng. Windows, Linux/Unix

đóng gói

Trước hết, hãy thảo luận về đóng gói python là gì — và cụ thể là PyInstaller. (Ghi chú. Tôi sử dụng các thuật ngữ đóng gói, đóng gói và đóng gói thay thế cho nhau. ) Mục tiêu của việc đóng gói chương trình python là tạo ra một tệp thực thi có thể chạy độc lập trên hệ điều hành. Chúng ta không nên nhầm lẫn điều này với việc đóng gói phần mềm độc hại nói chung, trong đó mục tiêu là che giấu mã độc khỏi các nhà phân tích và công cụ bảo mật. Bao bì Python không có ý định cung cấp bất kỳ bảo mật hoặc che giấu nào. Nó chỉ là một tác dụng phụ của bao bì. Khi chúng tôi đóng gói một chương trình python, công cụ mà chúng tôi sử dụng để đóng gói, chẳng hạn như PyInstaller, sẽ thực hiện như sau

  • Biên dịch tất cả. py các tệp nguồn thành mã byte python (. tệp pyc)
  • Thu thập tất cả mã nguồn được biên dịch của python và các phần phụ thuộc của python
  • Bao gồm trình thông dịch python phụ thuộc vào hệ điều hành (i. e. ; . 9. vì thế. 1. 0 trên Linux hoặc python37. dll trên Windows)
  • Kết hợp tất cả những thứ này với một sơ khai, trước tiên giải nén các tệp này vào đĩa hoặc bộ nhớ, sau đó thực thi mã python gốc với trình thông dịch đi kèm

Mặc dù có một vài dự án có thể tạo các tệp thực thi được đóng gói như vậy, nhưng dự án nổi tiếng nhất là PyInstaller

Để hiểu cách đóng gói hoạt động, chúng tôi tạo một tệp python được đóng gói có thể thực thi được trên Windows. Hình 1 cho thấy một chương trình ví dụ cực kỳ tinh vi đòi hỏi bằng thạc sĩ về kỹ thuật máy tính và khoảng 10 năm kinh nghiệm để tạo ra

Hình 1 - Chương trình thử nghiệm “evil_program. py”

Chúng ta có thể dễ dàng chạy chương trình này trong thiết bị đầu cuối Windows, như thể hiện trong Hình 2

Hình 2 - Chạy evil_program. py

Để biến chương trình python này thành một tệp EXE được đóng gói, chúng ta có thể sử dụng PyInstaller mà tôi đã cài đặt trong môi trường ảo python (Hình 3)

Hình 3 - Tạo EXE bằng PyInstaller

Bạn nên dành thời gian để cuộn qua các nhật ký vì chúng cung cấp một số thông tin chi tiết về những gì PyInstaller thực hiện bên trong. Sau khi hoàn thành, evil_program mới được tạo. exe được liệt kê trong thư mục \dist\. Hình 4 cho thấy chúng ta có thể chạy tệp thực thi này và nhận được kết quả giống như chạy mã trực tiếp. Sự khác biệt lớn là bây giờ chúng ta có thể di chuyển tệp EXE này sang một máy Windows khác và nó sẽ chạy độc lập mà không có bất kỳ sự phụ thuộc nào của python

Hình 4 - Chạy tập tin EXE vừa tạo

Giải nén python

Bây giờ chúng tôi có một tệp EXE được đóng gói, chúng tôi có thể thử hoàn nguyên tệp đó về mã nguồn python. Trong một kịch bản kỹ thuật đảo ngược thực sự, câu hỏi đầu tiên thường là, "làm cách nào để chúng tôi phát hiện ra rằng tệp nhị phân được phân tích là một chương trình python được đóng gói?"

Hình 5 - Tìm kiếm 'py' trong chuỗi nhị phân

Cụ thể đối với PyInstaller, chúng ta cũng sẽ thấy chuỗi MEIPASS ở dạng nhị phân

Câu hỏi thứ hai là "chương trình sử dụng phiên bản python nào?" . Đó là vì trước tiên PyInstaller giải nén tất cả các tệp trong thư mục tạm thời. Bằng cách theo dõi hoạt động của hệ thống tệp, chúng tôi có thể thấy rằng tệp python38. dll (Hình 6) được lưu trong thư mục tạm thời. Điều này cho chúng ta biết rằng python 3. 8 đã được sử dụng để tạo chương trình đóng gói và do đó chúng tôi sẽ cần cùng một phiên bản python cho tất cả các phân tích sâu hơn

Hình 6 - Giám sát hoạt động của hệ thống tập tin

Để khôi phục mã nguồn, chúng tôi phải giải quyết hai thách thức

  1. Giải nén tất cả các tệp từ tệp EXE. Điều đó sẽ cung cấp cho chúng tôi mã byte python đã biên dịch (. pyc) tập tin
  2. Dịch ngược thú vị. tập tin pyc

Quá trình giải nén tệp EXE sẽ giống nhau trong tất cả các phiên bản python trên tất cả các hệ điều hành. Thách thức lớn hơn là dịch ngược. pyc, vì điều đó thay đổi trong mọi phiên bản python và các công cụ chỉ hoạt động với các phiên bản cụ thể

Để giải nén tệp EXE này, chúng tôi sẽ sử dụng pyinstxttractor. Chỉ cần tải xuống pyinstxttractor. py vào thư mục mà bạn muốn làm việc với nó (Hình 7 cho biết cách thực hiện). Một chi tiết quan trọng cần lưu ý là trình thông dịch python được sử dụng phải cùng phiên bản với chương trình đóng gói python

Hình 7 - Giải nén evil_program. người cũ

Một chi tiết quan trọng khác là pyinstxttractor cũng cung cấp các gợi ý về tệp nào có thể là tệp chính của chương trình python. Thường có một số kết quả dương tính giả, nhưng đây vẫn là một trợ giúp rất lớn nếu dự án được phân tích là lớn. Trong trường hợp này, chúng tôi biết rằng tệp chính là evil_program. pyc. EXE được giải nén vào evil_program. thư mục exe_extracted (Hình 8)

Hình 8 - Đã trích xuất. tập tin pyc

Bước tiếp theo là dịch ngược evil_program. pyc. Để làm được điều đó, chúng tôi sẽ sử dụng một công cụ có tên uncompyle6. Một lần nữa, đây là điểm mà người ta phải ý thức về phiên bản python và tham khảo tài liệu về công cụ đang được sử dụng để dịch ngược. Uncompyle6 chỉ hỗ trợ tối đa python 3. 8. Sau đó, bạn sẽ phải tìm kiếm một công cụ khác (mà chúng ta sẽ thảo luận trong phần tiếp theo). Quá trình giải mã được thể hiện trong Hình 9

Hình 9 - Dịch ngược chương trình evil_program. pyc

Cùng với đó, chúng tôi đã đạt được mục tiêu của mình và khôi phục mã nguồn của chương trình python được đóng gói đơn giản này

Giải nén python >= 3. 9 trên Linux

Trong phần này, chúng ta sẽ thực hiện quy trình tương tự trong Linux bằng phiên bản python mới hơn. Tệp chúng tôi sẽ phân tích là một mẫu phần mềm độc hại thực sự mà chúng tôi đã tìm thấy trên VirusTotal trong quá trình tìm kiếm mối đe dọa gần đây của chúng tôi. Bạn có thể tìm thêm thông tin về mã nhị phân này trên VirusTotal. Khi tôi thiết kế ngược tệp, tôi nghĩ sẽ rất thú vị nếu viết một bài đăng trên blog về quá trình giải nén. Chúng tôi sẽ không tập trung vào phân tích mẫu trong bài đăng này

Để giải nén mẫu, chúng tôi lại sử dụng pyinstxttractor, nhưng với một thao tác vặn. Hình 10 cho thấy mẫu là mã nhị phân ELF 64 bit. Chúng tôi không thể sử dụng pyinstxttractor trực tiếp trên nhị phân ELF. Vì vậy, trước tiên chúng ta cần kết xuất phần pydata của tệp thành một tệp riêng và chạy pyinstxttractor trên đó

Hình 10 - Kết xuất phần pydata

Việc giải nén được hiển thị trong Hình 11. Một lần nữa, chúng ta cần có ý thức sử dụng đúng phiên bản python, trong trường hợp này là 3. 9

Hình 11 - Giải nén pydata. bãi rác

Thực tế là có RansomWare. pyc trong dữ liệu được giải nén cho thấy rõ chúng ta đang xử lý cái gì

Với con trăn 3. 9 chúng tôi không còn có thể sử dụng uncompyle6. Thay vào đó, chúng ta có thể sử dụng một công cụ như Decompyle++, đây là một dự án rất hứa hẹn sử dụng một cách tiếp cận khác, chung chung hơn để dịch ngược. Tuy nhiên, việc xây dựng dự án không được giải thích rõ ràng trên trang web, vì vậy Hình 12 chỉ cho bạn cách tải xuống và xây dựng dự án.  

Hình 12 - Trình dịch ngược tòa nhà ++ pycdc

Để gọi lệnh pycdc từ bất cứ đâu, chúng ta cũng có thể chạy sudo make install

Lệnh pycdc là trình dịch ngược, vì vậy chúng tôi sử dụng lệnh đó để khôi phục mã nguồn của RansomWare. pyc, như trong Hình 13

Hình 13 - Dịch ngược RansomWare. pyc

Cùng với đó, chúng tôi đã đạt được mục tiêu khôi phục hầu hết mã nguồn gốc của RansomWare. py. Thật không may, chúng ta cũng có thể thấy các chức năng như trong Hình 14, trong đó quá trình dịch ngược không thành công tại một số điểm.  

Hình 14 - Dịch ngược hàm write_key() không thành công

Điều này cũng xảy ra trong Java và. Net khi chúng tôi dịch ngược mã byte. Đôi khi, trình dịch ngược không thành công và chúng tôi chỉ nhận được một phần mã. Trong những trường hợp như vậy, chúng ta cần tìm những cách khác để xác định điều gì đã xảy ra trong chức năng đó, chẳng hạn như phân tích động. Trong trường hợp này, chúng ta có thể sử dụng lệnh pycdas để khôi phục mã byte 'đã tháo rời'. Ở đó, chúng ta có thể tra cứu các chức năng, nơi dịch ngược không thành công. Hình 15 cho thấy sự phân tách mã byte của hàm write_key()

Hình 15 - Tách bytecode của hàm write_key()

Ở phần đầu của phần này, tôi đã đề cập rằng chúng tôi sẽ không phân tích mẫu. Nó trông giống như ransomware, mã python được viết cho Windows nhưng được đóng gói dưới dạng tệp thực thi ELF, thường chạy trên hệ thống Linux/Unix. Điều này có thể chỉ ra rằng mẫu dành cho Hệ thống con Windows dành cho Linux (WSL). Nhưng đó là một câu chuyện cho một bài blog khác

Phần kết luận

Trong bài đăng trên blog này, chúng tôi đã đề cập đến cách giải nén và dịch ngược các chương trình python được đóng gói bằng PyInstaller. Chúng tôi cũng đã thảo luận về các tình huống sau

  • các cửa sổ
  • Linux
  • Phiên bản Python lớn hơn hoặc bằng 3. 9
  • Phiên bản Python thấp hơn hoặc bằng 3. 8

Phần mềm độc hại python kỹ thuật đảo ngược có thể rất hữu ích vì chúng tôi có thể phân tích nó ở cấp mã nguồn, tất nhiên là hiệu quả hơn nhiều

Bảo vệ Fortinet

Mẫu ransomware được phân tích trong blog này được phát hiện bằng chữ ký (AV) sau

ELF/Bộ mã hóa tệp. IG. tr

Vì PyInstaller ghi các tệp đã giải nén trên đĩa trước khi thực thi nó, FortiEDR cũng có thể xác định nội dung độc hại

IOC

Đối với mẫu ransomware đã thảo luận

Hxxps. //hình ảnh[. ]idgesg[. ]net/images/article/2018/02/ransomware_hacking_thinkstock_903183876-100749983-large[. ]jpg
lyrx_at_protonmail[. ] com
fernet_key. txt
GỬI THƯ ĐIỆN TỬ CHO TÔI. txt

Tìm hiểu thêm về tổ chức tình báo và nghiên cứu mối đe dọa FortiGuard Labs của Fortinet cũng như danh mục Dịch vụ và Đăng ký bảo mật của FortiGuard