Nhìn qua
Mở file bằng IDA ta thấy được cấu trúc chương trình khá đơn giản. Vẫn có khối nhập password, khối kiểm tra và khổi đưa ra kết quả.
Phân tích
- Xâu s2 được khởi tạo với giá trị không đổi và có những giá trị không thuộc mã ASCII
- Xâu s được nhập vào gồm 37 ký tự = len(s2)
- Xâu s được xử lý qua hàm get_tbl_entry()
- Xâu s được so sánh s2
- Nếu đúng => Correct, nếu sai => Wrong
Phân tích hàm get_tbl_entry() ta thấy ngay cách chuyển đổi như sau:
Các ký tự của s được đưa vào so sánh với các phần tử chẵn của mảng trans_tbl[]. Nếu giống nhau thì sẽ trả về giá trị của phần tử lẻ của trans_tbl[] ( trong hình trên thì byte_201281 là địa chỉ phần tử lẻ đầu tiên của tran_tbl[]). Nếu không có giá trị nào giống nhau thì sẽ trả về 0 ( kết thúc xâu ).
Nhận thấy mảng trans_tbl[] gồm các phần tử chắn là các mã ASCII và các phần tử lẻ là các mã hex khác. Nghĩa là quá trình biến đổi xem mảng trans_tbl[] như một bảng ánh xạ các giá trị trong bảng mã ASCII với các giá trị hex khác. Việc tìm ra flag bây giờ là ánh xạ ngược lại các giá trị trong s2 thành các giá trị trong bảng mã ASCII.
Ta viết code ánh xạ ngược để tìm ra flag 🙂
Flag: flag{t4ble_l00kups_ar3_b3tter_f0r_m3}