Thứ Bảy, 3 tháng 5, 2014

[write up] 0x3004.wargame.vn - ulock challenge

CTF 0x3004 gameover - cũng là lúc viết write up. Các write up cũng bắt đầu tràn lan trên Internet. Tôi cũng ko ngoại lệ tranh thủ viết 1 bài để đời

Write up ulock challenge
Level: 2
Tool: OllyDBG, Calc

----> Download This Challenge Here <----


Scan bằng bất kì packer detector nào ( riêng tôi vẫn dùng PEiD) được biết crackme viết bằng ASM. Load vào OllyDBG và run (quá khỏe không hề có Anti Debug)


Crackme có EP là 401000h. String của Unlock code cũng không hề bị dấu. Với tôi mọi chuyện cho đến bây giờ vẫn thuận buồm xuôi gió



Crackme dùng API GetDlgItemTextA để lấy chuỗi unlock code mà chúng ta nhập vào. Đồng thời API GetDlgItemTextA cũng trả về giá trị độ dài của chuỗi mà nó lấy đc. Code ở đây như sau
- Lấy Unlock Code mà chúng tôi nhập vào
- So sánh độ Unlock Code với 7
- Nếu lớn hơn 7 sẽ bypass bảng thông báo "Sai Unlock Code"

Quá đơn giản. Tôi nhập 12345678 và nhấn Unlock. Kết quả khá mĩ mãn. Tôi đã qua được first check là Unlock Code. Tiếp theo là fish serial cho name 0x3004. Tôi nhập Name là 0x3004 và serial bất kì --> Check --> Crackme crash

Có lẽ tôi bỏ sót điều gì đó chăng?? Vậy là Unlock Code không đơn giản như tôi nghĩ. Xem lại sau khi check độ dài chuỗi unlock crackme còn thực hiện 3 hàm call mà tôi đã chủ quan không để ý. Tôi trace lại kĩ và xem xét từng hàm call một

- Hàm Call thứ nhất "CALL 004012CD"

Hàm Call này thực hiện nhiệm vụ tính toán một giá trị từ Unlock code mà tôi nhập vào lưu vào 1 biến (tạm gọi là biến key. Biến này có giá trị 1 byte). Vậy tôi dự đoán crackme sẽ giải mã 1 đoạn code của chính nó dựa trên giá trị của biến key này. Việc Crackme bị crash lúc nãy có thể được giải thích rằng do tôi nhập sai Unlock Code --> sai key --> code được giải mã sai dẫn đến crash khi thực thi.

- Hàm Call thứ hai "CALL 004012F7"


1 vòng lặp xor 1 đoạn data (bắt đầu tại 4032A5h và kết thúc tại 4032BBh) của crackme cho biến key. Như vậy là tôi đã dự đoán đúng. 1 đoạn code của crackme sẽ được giải mã bằng thuật toán xor cho biến key


- Hàm call thứ ba "CALL 00401348" hực hiện việc enable/disable các textbox và button. Hàm này không quan trọng lắm.

Như vậy sau khi đã trace qua đoạn code mà tôi bỏ lỡ, vấn đề đặt ra ở đây là tìm ra được xor key làm sao cho phù hợp để có thể giải mã đoạn code kia. Ý tưởng đầu tiên của tôi là thực hiện brute force. 1 byte có giá trị từ 0 đến 255. Nếu tôi lượt bỏ giá trị 0 đi vẫn sẽ còn 255 trường hợp. Đối với tôi như vậy cũng là quá nhiều nên có lẽ sẽ dùng ý tưởng này như là kế sách cuối cùng. Ý tưởng tiếp theo của tôi là xác định/ dự đoán 1 số đoạn code có trong hàm bị mã hóa, từ đó suy ngược ra xor key tương ứng (có vẻ khá thi hơn). Thường thì hàm đầu tiên của 1 đoạn code thường là "PUSH EBP" có mã hex là 55h. Sau khi đã dự đoán đc code tôi tiến hành xor ngược lại với code đã mã hóa

55h xor 75h = 25h

Vậy xor key có thể là 25h. Tôi nhập lại Unlock code (bất kì) sau đó đổi giá trị key thành 25h trước khi crackme dùng biến key để decrypt code


Chạy hàm call decrypt code được


Code đã được giải mã. Vậy xor key đến thời điểm này chắc chắn là 25h. Đến lúc này tôi tiến hành fish crackme như bình thường với name là 0x3004. Đặt bp tại các vị trí trong hình có thể fish được serial 1 cách dễ dàng.



Fish được serial cũng chính là flag "21137D5FCAAC07F9"

- Game Over -

Thanks to:
Nguyễn Phương Nam, Nguyễn Hữu Thọ, LoveMagic (idid231), Dungvit, Levis
Tuts4you, REPT, REA, Cin1, URET, REiS, Crackmes.de
............
And YOU!

Quy Nhơn 1 ngày nóng
03/05/2014
Elvis

1 nhận xét: