Mini Factory

Link Challenge: Windows Linux

Hai chương trình đều như nhau chỉ khác hệ điều hành thôi. Mình RE file bên windows.

Okie, Bắt đầu nào. Như mọi khi xem em nó là gì đã rồi tính tiếp

Một chương trình viết bằng C++, không có gì đăc biệt hết. Chạy thử em nó


Yêu cầu nhập vào flag nhập đúng thì sẽ có thông báo chúc mừng. Okie bắt đầu xem binary nào. Tìm ngay chỗ thông báo win


Chương trình khá phức tạp nên đơn giản mình chỉ tập trung tìm đường đến đích và xem các hàm trên đường đó thôi. Tìm đường đến đích nào

Chỉ có duy nhất một chỗ để ta đến đích (phần màu đỏ). Để đến đích thì ta phải pass 2 cái check (phần màu xanh).

Giờ tìm cách pass check xanh đầu nào. Giá trị debug thì các bạn sẽ dễ dàng nhận ra nó là len(input) shl 3 = len(input) * 8 = 0x150 => len(input) = 0x2A = 42 (ký tự). Nhập vào flag dài 42 ký tự là qua được check 1

Giờ đến check xanh thứ 2. Nó compare dữ liệu nhập vào sau khi mã hóa với dữ liệu có sẵn ở 0x404254. Địa chỉ dữ liệu được mã hóa được lấy từ hàm sub_401100 (phần màu vàng). Sau khi vào đó xem thì mình thấy nó chỉ đóng vai trò support thôi chứ ko có chứa code mã hóa. Đặt breakpoint trong đó sẽ thấy có mấy hàm khác gọi nó nữa. Trace là thấy ngay thằng gọi:


Vòng lặp gọi 4 hàm được tính trước. Các bạn có thể debug xem từng hàm. Bên trong nó sẽ có mội hàm đó đều có 1 cái untargeted call nữa. Cái này mới là stub mã hóa chính. Chúng ta đi từng cái


Cái đầu tiên:

Cơ bản là nó cộng 3 vào input đầu vào. Ỏ phía trên dùng thanh ghi xmm để cộng 32 bytes đầu với giá trị ở 0x13042C0 (Base Image của mình đang là 0x1300000) với 2 lần cộng mỗi lần 16 bytes. Phàn còn lại 42–30 = 12 bytes thì lặp cộng vào

Qua cái thứ 2:

Nhận đầu vào là 1 nửa chuỗi đã mã háo qua bước 1. Sau đó thực hiện

s[i] = s[i] ^ s[i -1] (1 ≤ i ≤ 20)

Qua cái thứ 3:

Nhận đầu vào là nửa sau của chuỗi input đã qua mã hóa ở bước 1. Đầu tiên nó sẽ mã hóa ký tự thứ nhất (tức là thứ 22 của chuỗi đầu vào) với công thức

s[0] = s[0] ^ (s[0] shr 3).

Còn lại được mã hóa ở stub dưới theo công thức:

tmp = (s[i-1] shr 4) ^ s[i];

s[i] = tmp ^ (tmp shl 4)

Qua cái thứ cuối nào:

Nhận đầu vào nguyên 42 ký tự. Swap đối xứng (thằng đầu đổi với thằng cuối, thằng thứ 2 đổi với kế cuối, …)

Xong. Thế là ta đã hiểu hết đoạn mã hóa giờ chỉ cần viết code giải mã là ra flag thôi


Và flag sau khi chạy:


Kết thúc giải team mình đứng nhì (z3r0_n1ght) kết quả khá tốt. Bản thân thì hôm nay thi đâu tốt được first blood RE một với phần thưởng từ ban tổ chức. Hóng Round 3

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s