⚠ 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.

[02] Pixel Poker

I said you wouldn't win that last one. I lied. The last challenge was basically a captcha. Now the real work begins. Shall we play another game?

7-zip password: flare

Theo mô tả của level này thì bài đầu tiên mới chỉ là bài kiểm tra phân biệt người và máy thôi. Bây giờ mới là bắt đầu của những thử thách khó hơn. Gét gô!

Công cụ sử dụng:

  • CFF Explorer
  • IDA Pro
  • Python
    • PIL: pip install pillow

Nội dung readme.txt

Welcome to PixelPoker ^_^, the pixel game that's sweeping the nation!
Your goal is simple: find the correct pixel and click it
Good luck!

Chương trình hướng đến việc cần phải lựa chọn 1 điểm ảnh với tọa độ được thể hiện trên tên của cửa sổ và có giới hạn số lần thử là 10 lần.

Untitled

Tiếp đến mình sử dụng CFF Explorer để quan sát metadata của file EXE. Chú ý thấy có 2 resource là dạng Bitmaps (ảnh) có độ ngẫu nhiên cao làm mình nghĩ tới việc thực hiện tính toán dựa trên 2 ảnh này, ví dụ là +, -, ^

Untitled

Sử dụng Python để subtract 2 ảnh bitmap có ID 129 và 133 và lưu lại.

from PIL import Image

# Read the Image
image1 = Image.open("Bitmap129.bmp")
image2 = Image.open("Bitmap133.bmp")

print(image1.size)
w,h = image1.size
image = Image.new(mode="RGB", size = image1.size)
for ix in range(w):
    for iy in range(h):
        a = image1.getpixel((ix, iy))
        b = image2.getpixel((ix, iy))
        if a!=b:
            ta = abs(a[0] - b[0])
            tb = abs(a[1] - b[1])
            tc = abs(a[2] - b[2])
            b = (ta, tb, tc)
            image.putpixel((ix, iy), b)

# Save the Image
image.save("BitmapDiff.bmp")

Đây là nội dung của ảnh sau xử lý.

02_BitmapDiff.bmp

Sau khi submit flag xong thì mình mới biết chuỗi trong ảnh chính là flag của level này nhưng vì có một số kí tự có khả năng bị nhận dạng nhầm như 1, !, i, I, l, L và có bóng hình Rickroll ở đây nên mình quyết định làm tiếp để tìm ra bản chính thức.

Do tính chất độc lập của các lần thử nên hoàn toàn có thể thiết kế một chương trình tự động click chuột và patch chương trình để vượt giới hạn 10 lần thử. Mình sẽ lựa chọn cách khác là phân tích chương trình để tìm ra các thao tác cần thiết để có flag. CFF Explorer cho biết chương trình là bản PE32 và trình biên dịch dự đoán là Visual C++ 8. Load vào trong IDA Pro sau đó tìm kiếm chuỗi báo sai sau lần thử thứ 10 Womp womp (Trong IDA nhấn Shift + F12) được sử dụng bởi hàm sub_4012C0.

Một số tên biến dữ liệu đã được đổi để bạn đọc tiện theo dõi.

Untitled

Bước so sánh ở dòng 43 và 45 kiểm tra giá trị của tọa độ click chuột theo trục (x,y) thỏa mãn tính toán:

x = 0x52414c46 % (độ rộng resource ảnh ID 129) = 0x52414c46 % 741 = 95

y = 0x6e4f2d45 % (độ cao resource ảnh ID 129) = 0x6e4f2d45 % 641 = 313

Như vậy nếu click chính xác tọa độ (95,313) thì sẽ chuyển sang luồng khác và có kết quả (sau vài giây thực hiện xử lý tại sub_4015D0 ) như sau

Untitled

Bonus, vậy điều gì xảy ra nếu resource được load có ID là 133 thay vì 129?

Untitled