Nghịch lý Birthday là 1 trong những nghịch lý được áp dụng rất nhiều khi dùng để giải mã trong Crypto. Câu hỏi: "Cần ít nhất bao nhiêu người để xác suất có 1 cặp trong số đó trùng ngày-tháng sinh với nhau là > 50%?" Câu trả lời là 23 người. Nghe qua thì hơi khó tin, lần đầu nghe mình cũng không tin lắm :)) nhưng để chứng minh nó bằng các giải ngược thì khá đơn giản: Gọi A là biến cố không có ai trong 23 người cùng ngày sinh, ta cần tính 1- P(A). Ta có: Với mỗi người ta có cách chọn ngày sinh lần lượt là: 365, 365 - 1, ..., 365 - 22 Không gian mẫu: 365^23 Suy ra: 1- P(A) = 50.73% Vậy nên trong 1 lớp họp có hơn 30 người, xác suất có 2 người trùng ngày sinh lên tới gần 70%, nên thường trong 1 lớp sẽ có 2 người trung ngày sinh. Phát biểu: Chỉ cần thử 1.2 * sqrt(n) thì sẽ có tới 50% là có 1 cặp giống nhau. Áp dụng định lý này với phương pháp Brute-force:
Đầu tiên khi run code ta thấy hiện ta 1 bảng lời chào và menu lựa chọn:
Đối chiếu với 1 số def trong code để loại bỏ những def chỉ có tác dụng print câu chào, và ta đoán việc của bài này là tìm cách lấy được License Key.
Chọn c để thử và nhập 1 số bất kì:
Ta thấy hiện ra thông báo và vòng lặp menu được thực hiện lại.Bây giờ quay lại và đọc kĩ hơn về code, ta thấy khi chọn c thì nó sẽ gọi hàm enter_license()
Tìm hiểu sâu hơn về hàm này, ta thấyuser_key được nhập vào và hàm strip() để xóa các khoảng trắng đầu và cuối chuỗi input đó. Sau đó nó được đưa vào hàm check_key với tham số lần lượt là user_key và bUsername_trial. Nếu đúng nó sẽ gọi hàm decrypt_full_version cho user_key đó. Tiếp tục đi xem hàm check_key
ở phần đầu, check_key gọi tới biến global key_full_template_trial để check xem độ dài có bằng nhau hay không:key_full_template_trial sẽ có dạng picoCTF{1n_7h3_|<3y_of_xxxxxxxx} sẽ có 32 kí tự. Sau đó nó kiểm tra xem có giống key_part_static1_trial hay không, nó sẽ có dạng "picoCTF{1n_7h3_|<3y_of_"
Vậy là việc của mình là tìm ra "xxxxxxxx" để thế vào.
"xxxxxxxx" sẽ lần lượt được check với các kí tự với đầu vào là bUsername_trial và được mã hóa và lấy kí tự như code.
Viết 1 đoạn code đơn giản(đơn giản vì đi copy code cũ :))
đoạn code này in ra kí tự mà ra sẽ đưa key[i] vào để so sánh.Thay lần lượt "4" bằng các thứ tự là 4, 5, 3, 6, 2, 7, 1, 8 ta được các chữ 5, 4, e, f, 6, 2, 9, 2.
Vậy flag sẽ là: picoCTF{1n_7h3_|<3y_of_54ef6292}
Nhận xét
Đăng nhận xét