[Intent CTF 2021] Scadomware

Người viết : Chu Tuấn Kiệt



Challenge cho mình hai file : 

    ·      Ransomware.exe : một con ransomware

    ·      important.intent.enc : và một file bị mã hóa 

Nhiệm vụ là dịch ngược con ransomware để decrypt dữ liệu của file enc thui.

    Mở ransomware bằng IDA x32 để phân tích, (ransomware được viết bằng win32)

    Mình sẽ f5 để mở luôn mã giả cho tiện phân tích hành động của ransomware

I . Flow chương trình


    Ransomware sẽ khởi tạo các biến cơ bản, và thực hiện tìm kiếm file có phân mrong .intent (các file khác được bỏ qua)


    Và thực hiện mã hóa file .intent tìm thấy.

    Dữ liệu trong file được mã hóa qua hai loại mã hóa.


    Sau khi mã hóa, dữ liệu được ghi lại vào file .enc và  file gốc bị xóa.


II.Chức năng các hàm chính

1.   Các hàm khởi tạo  sub_421D60()  và sub_421080()


a. sub_421D60()

    Thực hiện debug luôn để xem các hàm này làm gì.


Ta thấy biến một chuỗi Dest được tạo.


Dest = “YouTakeTheRedPillYouStayInWonderlandAndIShowYouHowDeepTheRabbitHoleGoes”


b.  sub_421080()

    Tiếp tục đặt breakpoint và trace qua tương tự để xem nó đang định làm gì.

Mình đọc qua hàm thì thấy nó đang khởi tạo giá trị cho một mảng dword_424378 có 256 phân tử.


2.   sub_4219F0() Hàm thực hiện tìm kiếm và encrypt file

    Sau khi debug qua hàm này, mình nhận thấy nó đang thực hiện tìm file .intent để mã hóa, còn các file khác của máy thì bỏ qua(may quá == nó mà mã hóa hết thì toang, tại mình làm trên máy thật).


    Để test mình tạo ra một file kiet.intent và để trong thùng rác (== mình để ý thấy nó tìm thùng rác đầu tiên :v chắc vì đam mê). 

    Sau khi thấy file .intent của mình, nó in ra màn hình một đoạn trông giống địa chỉ ipv4 máy mình ghê  òm đúng luôn :3.

    Tiếp tục nào…

3.    Hàm sub_4216A0(v9) : Encrypt data

    Đặt bp tại v8 để xem kết quả của các bước trên luôn ^^:



    V8 = “1333”





    Tiếp theo chương trình ghi vào buffer một chuỗi theo định dạng "%s%s%08x%d---%d" với các tham số như hình trên. 

    Đặt bp và trace qua xem buffer được ghi nội dung như thế nào:

    Chuỗi buffer này được khởi tạo với các giá trị ngẫu nhiên, và được sử dụng làm key cho các mã hóa bên dưới, => gây khó khăn cho người dùng nếu có ý định decrypt nội dung file enc….



4.   Phân tích hàm sub_4215B0() : mã hóa SHA1

    Tại sao mình lại biết được là mã hóa SHA1 ? ^^ à mình search google thấy thui

    Thử search gg xem nó là loại hash nào….

    Và mình thấy có một trang của pháp sư trung hoa nào đó giải thích  ^^.

    0x8004 đại diện cho hash SHA1

    Okay chỉ cần biết data của mình sẽ bị hash SHA1 là đủ rồi.

        Giá trị hash được lưu ở a3.


    a3 chính là v35 được truyền vào.

    Nên ta tiếp tục đem v35 đã được hash cho qua hàm mã hóa thứ 2.

    Tiếp tục qua hàm encrypt thứ 2 nào.!!

5.  Hàm sub_421390() : Encrypt AES 

    Trước khi thực hiện mã hóa, ransomware thực hiện khởi tạo key và iv cho thuật toán mã hóa AES


    Cần xem đoạn chương trình trên sử dụng loại mã hóa gì.

    Mình tiếp tục search và tìm thấy một file của thư viện win32 có chi tiết các tham số

 https://github.com/Wiladams/TINN/blob/master/src/win32/WinCrypt.lua


     ^^ => AES với tham số 24



   Và kiểu mã hóa CBC với tham số 1

 https://github.com/wine-mirror/wine/blob/master/include/wincrypt.h


    V26

    Đoạn này mệt quá lười giải thích ….

III.  Giải quyết bài toán dịch ngược

    Qua phân tích trên ta đã nắm được cách ransomware mã hóa file.  Giờ cần code một chương trình để dịch ngược file bị enc 

    Vấn đề cần phát sinh: Ta thấy khi khởi tạo buffer các biến tham số là ngẫu nhiên theo thời gian nên ta không thể xác định chính xác

    Đang bế tắc đoạn này == thì tự nhiên mình kéo xuống hàm ghi file đọc thử (tại thấy nó cứ làm cái gì gì mãi mới ghi file)


    Ta có :


    ·       V3 : kích thước file gốc
    ·       V23 : được tính qua giá trị size
    ·       v23 = 857483 - (int)((double)(int)Size / -32767.0 * 2146626165.0);
    ·       size = rand() với srand(v3);
    ·       Src = v7 = một hàm xử lý với địa chỉ ip và trả về một con số (cái này bruteforce được)

    Vậy là từ file enc có thể lấy được cái giá trị này mà không cần tính toán gì nhiều ^^~

 

    Vậy là ta có thể khởi tạo lại key theo form

    Tiếp tục thực hiện hash để tạo key

    Và decrypt AES bằng key đã tạo là xong rùi ^^.

IV.        Code và thực hiện


    Tìm được flag là : INTENT{crypt0s_ar3_the_w0rst_but_d4amn_u_g00000d}

     ==crypto thật khó nhưng không làm khó được bạn

V.          Tổng kết

·      Challenge về ý tưởng không khó nhưng thực hiện nhiều bước khiến mình bị rối và phải debug suy đoán nhiều lần.

·      Cần một số kiến thức nhất định về crypto để giải quyết bài toán.

·     Và đối với các challenge ransomware, khuyến khích các bạn không thực hiện trên máy thật mà chuyển sang máy ảo cho an toàn nhé !








































 


 







Nhận xét

Đăng nhận xét