⚠ 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
.
Chạy thử file này:
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ả:
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
.
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.
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:
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:
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ơ:
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:
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:
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?
độ 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:
U_cRackeD_th1$_maG1cBaLL_!!_@flare-on.com