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: 

unpackme.py picoCTF (reverse)

 Tải file python và chạy thử thì ta biết được bài này sẽ cần password: 


Và khi mở code lên: 

wow, không hề có những dòng in ra màn hình "What's the password?" hay "That password is incorrect."
Bây giờ đọc đoạn mã, ở đây ta tìm hiểu xem các hàm ở file này sử dụng, và hàm mới ở đây là Fernet:


Rõ ràng, với ví dụ này, ta thấy được đoạn code file unpackme.py đã giải mã đoạn payload. Ta chú ý đến lệnh: "exec" đây là 1 lệnh thực thi, tức là khả năng đoạn payload này khi được giải mã sẽ là 1 đoạn code, bây giờ thay vì "exec" thực thi luôn thì ta sẽ xem đoạn code đó là gì: 

thay "exec" = "print" để xem đoạn code.
Đến đây thì rõ ràng rồi, ta đã có flag.


Nhận xét