Chuyển đến nội dung chính

[Crypto] Birthday Paradox

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: 

keygenme-py picoCTF(reverse)

 Đầ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ấy 



user_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