Protected

Link challenge: Protected.exe

Mở đầu xin nói sơ qua về cuộc thi. Lần này Round 3 đề gắt vl. Feed toàn tập không giải được bài RE nào 😢. Được cái sang năm mới thoát khỏi phốt đứng nhì , nhảy xuống đứng 5 cho nó khác😜. Okie, không dài dòng nữa giải em nó nào

Phải nói người nghĩ ra ý tưởng bài này kinh dị thật. Chơi kiểu này đúng là khó mà bẻ khóa được. Tóm tắt ngắn gọn thì chương trình tự điều điều khiển chính mình giống như bạn ngồi debug và thay đổi thông tin context của process vậy. Chương trình cũng có thể được chia làm 2 là Process cha và Process con .

Ban đầu phía bên phía nhánh cha sẽ chạy và tạo ra thêm 1 Process là chính chương trình nữa. Vì nó sử dụng chung mutex là “MATESCTF_2019” nên thằng con sau khi start sẽ nhảy qua nhánh bên phải 😜

Sau khi tạo xong thằng con, Process cha control thằng con thông qua các Debug_Event.

Ở đây sẽ xử lý 3, 4 loại Debug event code khác nhau. Ta chỉ quan tâm đến Debug event có code là 1 do lệnh INT 3 tạo ra thôi. Ghé qua nhánh con xem 1 chút. Mới vào thấy ngay lớp phòng thủ đầu tiên đó là kiểm tra Process ID của thằng cha do lúc thằng cha tạo ra con có truyền vào 1 tham giá trị là process ID của nó. Cái này nếu không đụng gì thì sẽ pass dễ dàng thôi😊

Giá trị tính được sẽ được check trong function callback của cái Dialog.

Cái này mình ko quan tâm lắm. Vào phần chính của e nó luôn. 😎

Như các bạn thấy thì đoạn code có lệnh INT 3 trap debugger tạo ta Debug Event có mã code là 1 nên thằng con sẽ ngừng lại và chờ thằng cha xử lý. Quay lại phía thằng cha phần xử lý. Như đã nói mình chỉ quan tâm đến phần xử lý cho Debug event có mã code 1. Lần theo chúng ta sẽ thấy có 1 hàm xử lý chính cho việc này

Vào trong thì các bạn sẽ thấy cả nùi thứ. Nhìn vào cái biểu đồ mô phỏng mini đã thấy mùi của VM 😂.

Mình sẽ nói về chiến thuật trước. Process cha sẽ quản lý thằng con bằng cách liên tục ghi chỉnh thanh ghi EIP của thằng con và ghi vào vị trí đó giá trị 0xCC (INT 3) để nó nhận được Event mà xử lý. Mở đầu là INT 3 có sẽ trong code bên nhánh của Process con và đương nhiên sau đó là một vụ liên hoàn ăn INT 3😢. Nó làm mình nhớ lại bài Flare-on stage 9 năm vừa rồi. Liên tục ăn exception để chạy code. Kinh vl😆

Thật sự thì cách thằng Process cha làm không khác gì cách mà các debugger làm. Không thể chèn thêm byte 0xCC (INT 3) để trap debug được mà phải lưu byte tại EIP của Process debug vào vùng nhớ tạm rồi sửa lại byte đó thành 0xCC. Một chiến lược cổ điển tránh sự sai lệnh về offset🤔

Phần chính để quản lý cái Process con nằm ở 18 case switch. Trong các case thường sẽ có những hàm sub_404480(int reg) và sub_404550(int reg, int value) . Vào trong các bạn sẽ thấy từng trong mỗi case sẽ như thế này

Nhìn vào đoán ra ngay là hàm sub_404480(int reg) sẽ lấy giá trị thanh ghi từ Process con, tương tự hàm sub_404550(int reg, int value) để set value vào thanh ghi cho Process con. Ta có thể tạo mapping cho giá trị reg truyền vào đơn giản

1 : EAX, 2: EBX, 3: ECX, 4: EDX, 5: ESI, 6: EDI, 7: ESP, 8 : EIP, 9 : EBP

Okie, quay lại 18 case. Mình ko có cách nào hay hơn là ngồi đọc code từng case. Đọc vài cái là các bạn sẽ quen ngay thôi 😜. Mình sẽ nói quy luật. Đọc 5 bytes từ vị trí EIP. Dúng byte đầu tiên để xác định case của switch. Tùy theo case mà nó sẽ sử dụng tiếp 2 hoặc 3 bytes. Ví dụ

Với giá trị bytes thứ 3 nó sẽ đọc thanh ghi của Thằng con ứng với mapping các thanh ghi và giá trị phía trên. Sau đó đưa giá trị đó vào thanh ghi ứng với giá trị mapping của byte thứ 2. Case này dùng tổng cộng là 3 byte nên nó công EIP của process Con lên 2 xử lý tiếp. Nhìn rắt rối thế thôi chứ tổng quan thì case 0 này tương ừng với lệnh mov reg1, reg2

Tương tự các bạn sẽ có các case khác tạo thành opcode riêng giống VM vậy

Case 0: mov reg1, reg2

Case 1: mov reg, imm

Case 2: xor reg1, reg2

Case 3: sub reg1, reg2

Case 4: add reg1, reg2

Case 5: push reg

Case 6: pop reg

…..

Case 16: add reg2, reg3; mov reg1, DWORD [reg2]

Case 17: jmp

Sao khi hiểu được được cách nó thực hiện thì ta viết script để thực hiện tự động cho nhanh. Code generate assembly từ opcode mới (Code chỉ mang tính chất tham khảo 😜)

Với code assembly mới thì các bạn dễ dàng tính được. 15 ký tự đầu và 1 ký tự cuối. Khúc giữa 4 byte ký tự thứ 16 đến 19 nó chơi chuyển đến hàm check có sẵn trong Process con đó là hàm sub_401000(int x, hWnd)

Đoạn code liên quan bên phần opcode mới generate ra assembly sẽ là:

4 bytes lưu trong eax và được xor với 1 giá trị bí ẩn trong stack của Process con. Sau đó nó lấy giá trị tham số hWnd cần rồi đẩy vào stack, cuối cùng là set return address.

4 bytes lưu trong eax và được xor với 1 giá trị bí ẩn trong stack của Process con. Sau đó nó lấy giá trị tham số hWnd cần rồi đẩy vào stack, cuối cùng là set return address.

Hàm sub_401000(int x, hWnd) khá đơn giản.

Lấy giá trị x truyền vào xor với 4 bytes đầu của chuỗi Title của Windows (Dòng chữ “Security key required”). Lấy 4 bytes = “Secu” chuyển qua dword ta có giá trị 0x75636553. Còn lại giá trị bí ẩn mình nhắc phía trên thì chỉ việc đặt debug ở case số 16 là có được giá trị nó là 0x4978BBEB. Từ đó ta dễ dàng tý ngược lại 4 bytes của input. À mà để debug được thì ta cần bypass check anti-debug ở hàm sub_404FD0. Có thể fill nop hoặc dùng plugin như IDA Stealth để bypass cũng được

Cuối cùng key cần tìm sẽ là: gAISzUSwJl4i6BITLOp8

Nhập vào chương tình ta sẽ được thông báo flag:

Flag: matesctf{Just_4n0ther_l4m3_pr0t3ct0r}

Tổng kết sau cuộc thi. Ông bà nói chí phải sự bất quá 3😢. 2 lần trước đều clear RE lần thứ 3 feed toàn tập. Nhưng cũng ko đến nỗi tệ, hôm nay học được rất nhiều điều mới. Học được cách RE IoT intel hex file mặt dù chỉ mới tìm ra được hàm và không thể làm gì thêm, chắc phải sắm 1 bộ kit rồi 🤔. Học được cả kiểu chạy lạ đời này nữa cơ bản là thằng nghĩ ra quá IQ vô cực quá😒

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