⚠ Spoiler: Đây là write-up cho các challenge của Flare-on 9 tổ chức vào khoảng tháng 11/2022 tại Website.

[03] Magic 8 Ball

You got a question? Ask the 8 ball!

7-zip password: flare

Sau khi giải nén ta được một thư mục với khá nhiều file khác nhau. File chúng ta cần quan tâm chính là Magic8Ball.exe.

Extracted content

Chạy thử file này:

First run

Công cụ sử dụng:

  • IDA Pro

Ta có thể ấn thử các phím Up, Down, Left, Right thì khi đấy quả bóng (the ball) sẽ bị lắc. Ngoài ra ta cũng có thể điền vào câu hỏi và sau đó bấm Enter để nhận được kết quả:

The predict result

OK, load thử binary này vào IDA Pro (bản 32-bit) và mở subview Strings (Shift+F12) ta có thể thấy ngay các ref liên quan đến câu predict của magic 8 ball. Tất cả các string này được sử dụng ở sub_4012B0.

The predict strings in IDA

Tiếp tục theo dấu xem hàm nào call đến hàm này (chúng ta sẽ rename là predict_string_func) thì thấy nó được gọi từ sub_4027A0, có vẻ cũng chính là hàm main của chương trình luôn. Để ý phía dưới có một vòng lặp do while, rất giống với vòng lặp xử lý các sự kiện (event) rất hay gặp trong các ứng dụng GUI.

Main function

Sau khi đi dạo một vòng vào các hàm trong main function, chúng ta thấy sub_4024E0 có vẻ sẽ là nơi xử lý các input của chúng ta, do có các hàm với các tham số là chuỗi "U", "D", "L", "R" tương ứng với 4 phím định hướng:

Input handle function

Kéo xuống phía dưới một chút của hàm này, chúng ta bắt gặp đoạn sau:

Last lines of handle function

Tại đây v4 chính là mảng key code mà chúng ta nhập vào. Nếu convert 76 sang char chúng ta sẽ được tương ứng chuỗi 'L', tương ứng với phím Left. Chuỗi if so sánh này sẽ đảm bảo là chúng ta phải nhập đủ và đúng thứ tự của các ký tự trong chuỗi. Điều này làm chúng ta liên tưởng đến Konami Code để xin được 30 mạng trong game Contra thủa ấu thơ:

Konami Code

Còn trong trường hợp này, chuỗi chúng ta cần bấm sẽ là (convert tương ứng các số 76, 85, 82, 68 sang char):

LLURULDUL

Sau khi kiểm tra hết chuỗi phím này, chương trình sẽ thực hiện so sánh chuỗi, độ dài là 15 ký tự:

strncmp(v21, (this + 92), 0xFu);

rất có thể đây là so sánh chuỗi câu hỏi chúng ta nhập vào xem có đúng không để in ra flag. Ta có thể đặt breakpoint ở dòng 165, ngay ở lệnh call đến strncmp và chạy chương trình:

Breakpoint at strncmp

Nhập vào câu hỏi hello? và sau đó bấm đúng chuỗi phím mũi tên lên xuống trái phải: LLURULDUL rồi Enter, ta thấy chương trình break ở lệnh call của chúng ta:

Fake question

lúc này ecx chỉ đến vùng nhớ có chuỗi hello? mà ta nhập vào, còn eax là chuỗi câu hỏi đúng:

gimme flag pls ?

gimme flag pls?

độ dài đúng 15 ký tự.

Chạy lại chương trình, nhập đúng chuỗi phím định hướng cùng câu hỏi đúng sẽ in ra flag:

This is the flag

U_cRackeD_th1$_maG1cBaLL_!!_@flare-on.com