[WHITE HAT 2014] RE 300

SHARE ME NOW

WHITE HAT 2014 – RE 300

Hôm này chủ nhật rảnh rỗi nhân tiện lập blog mới. Mình sẽ viết write-up cho RE300 của cuộc thi WhiteHat 2014 do BKAV tổ chức vừa qua để mở hàng cho blog mới này. Có thời gian rảnh rỗi mình sẽ viết thêm nhiều tut nữa. 🙂

Tải “RE300” Tại đây

Tìm hiểu sơ qua nào:

  • Nó là một tệp tin thực thi dạng Console. Chạy thử thì thấy nó kiểm tra theo dạng Tài khoản – Mật khẩu.
  • Dùng công cụ ExeInfo PE và plug-in Hash & Crypto Detector của nó quét thì thấy mục tiêu của chúng ta được viết bằng MSVC++ 2012 và không bị nén hay bảo vệ bởi Packer / Protector nào.

clip_image001

Kéo mục tiêu của chúng ta vào OllyDbg (em dùng OllyDbg 2.01). Nếu ai muốn trực quan hơn thì có thể dùng IDA hoặc dùng tệp tin *.map tạo ra từ IDA rồi import vào OllyDbg cho dễ nhìn. Không biết có phải do cái IDA của em hay do cái RE300 mà em ko dùng chức năng P-seudo C đc, nhưng mà không sao, nhạc nào cũng nhảy.

Chúng ta bắt đầu nào. Rất dễ để chúng ta dùng chức năng cơ bản “Search for -> All referenced strings” tìm đến đoạn mã chính.

clip_image002

Nhấn đúp vào địa chỉ 008C12D2 ta đến hàm mà chúng ta đang cần tìm.

clip_image003

Ngay đầu hàm, đoạn mã thứ nhất kia sẽ dùng hai hàm cin / cout trong thư viện I/O chuẩn của C++ để hiển thị và lấy hai chuỗi tài khoản và mật khẩu nhập từ bàn phím.

Ở đoạn thứ hai nó đưa địa chỉ của chuỗi mật khẩu vào ECX và EDX, và dùng vòng lặp tăng dần địa chỉ trong thành ghi ECX đến địa chỉ của kí tự cuối cùng. Hiệu của ECX và EDX lúc này chính là độ dài chuỗi và kiểm tra nếu độ dài mật khẩu khác 10h (16.) sẽ không thỏa mãn điều kiện và nhảy đến đoạn mã thoát chương trình.

Xuống tiếp chúng ta sẽ gặp một vòng lặp sau:

clip_image004

Nhìn sơ qua thì cũng nhận ra đoạn này sẽ chuyển chữ viết hoa nếu có trong mật khẩu thành chữ thường bằng cách cộng thêm 20h (32.) với mã ASCII của ký tự viết hoa đó.

Thêm vòng lặp nữa:

clip_image001[1]

Đoạn mã chứa vòng lặp thứ nhất kia sẽ kiểm tra mật khẩu có hợp lệ hay không. Mật khẩu hợp lệ sẽ chứa những ký tự trong khoảng [‘0’..’9’,’a’..’f’], nếu không hợp lệ sẽ nhảy đến đoạn mã thoát chương trình. Tiếp theo phía sau nó là đoạn mã kiểm tra độ dài của tên tài khoản (Note: Chắc thím tác giả viết cái RE300 này lúc đang ngắm gái nên kiểm tra nhầm biến. Đáng lẽ kiểm tra biến chứa độ dài thì thím ấy lại nhầm thành kiểm tra biến vừa đặt là 0 ngay trước đó nếu lớn hơn hoặc bằng 8 thì nhảy, rất tiếc là nó luôn bằng 0).

Lại thêm một vòng lặp nữa:

clip_image006

Đoạn mã này sẽ lặp để chuyển chuỗi từng cặp hai ký tự của mật khẩu sang mảng 8 BYTE bằng phép toán: P[i] SHL 4 + P[i + 1] tương đương P[i]*10h + P[i + 1]. Nhìn hình dưới đây để hình dung dễ hơn, kết quả đoạn dưới sẽ thành đoạn trên:

clip_image007

Đoạn mã tiếp theo sẽ là đoạn mã thuật toán chính của RE300 này:

clip_image008

Sau khi hai vòng lặp kết thúc kết quả ta có là một dãy 8 BYTE. Dãy 8 BYTE này sẽ được tác giả dùng vòng lặp so sánh lần lượt từng BYTE của nó với từng BYTE của hai số DWORD BAA5E82FBD0FA4A4. Nếu có một sự khác biệt nó sẽ nhảy đến đoạn thông báo sai “Ooop” và thoát chương trình.

clip_image009

(Note: Hai DWORD liền kề nhau và theo nguyên lý kết thúc nhỏ (Little Endian) của Windows sẽ tạo thành một mảng 8 BYTE có thứ tự “2F E8 A5 BA A4 A4 0F BD”.)

Như các bạn đã thấy ở hình trên ta sẽ có đoạn mã giả sau:

clip_image010

Nhìn đoạn mã giả trên chúng ta sẽ thấy nó dùng hai vòng lặp lồng nhau, ở vòng lặp ngoài sẽ lấy từng BYTE mà chuỗi mật khẩu đã chuyển sang dạng mảng số 8 BYTE liền kề trước đó và dùng phép toán XOR với mã ASCII của từng ký tự trong tên tài khoản ở vòng lặp bên ngoài, kết quả phép tính này sẽ làm chỉ số cho mảng hằng số gồm 256 BYTE mà mình đặt tên là const_values kia và kết quả cuối cùng là nó cũng sẽ tạo ra một mảng 8 BYTE kề nhau.

Đến đây, chúng ta sẽ tìm phương pháp giải quyết. Dễ dàng nhận ra, mấu chốt của bài toán này là hai số DWORD BAA5E82FBD0FA4A4. Nhìn thuật toán này thì không khó để chúng ta có thể giải mã ngược lại theo phương pháp đi từ dưới lên (Bottom Up).

Các bạn nhìn mã mình viết bằng ngôn ngữ C++ dưới đây:

clip_image011

Biên dịch và thực thi mã của chúng ta:

clip_image012

Chạy RE300 kiểm tra thử thôi nào:

clip_image013

Goodjob!!! Rất nhẹ nhàng cho một bài 300 điểm đúng ko ạ? 🙂

Tải “RE300-Solve” Tại đây

Leave a Reply

Your email address will not be published. Required fields are marked *