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

Bài đăng

[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: 
Các bài đăng gần đây

[LẬP TRÌNH MẠNG] App chat Server/Client C/C++

Github: https://github.com/tungduong03/App-Chat Server: C++ Client: C++ MFC Dialog Để test thử, các bạn chỉ cần tải về và chạy file ServerC.exe sau đó chạy Client.exe là đã có thể kết nối. Cần nắm 1 số lệnh Command như:  -  -  -  Để nghịch với code, khi code thì mình dùng Visual Studio để dễ dàng code và build, mọi người chỉ cần mở file sln là có thể code được rồi, mọi người có thể tham khảo!  Nếu có thắc mắc hay mình có sai sót ở đâu góp ý mình với nhé!

[Web] Simple HTTP Proxy - Cookie Hân Hoan

Bài này có file code, ta có thể tải về và mở file run.py: ở đây, ta thấy nếu muốn lấy được flag, ta cần gửi POST request path: /admin Và ở đây thì cần phải thực hiện bởi localhost. Vậy ta sẽ dùng /socket để thực hiện: Ta nhập ở phần socket: Host là 127.0.0.1 port 1337 Lưu ý là ở POST thì cần thêm 1 dòng trắng bên dưới (để phân biệt với GET) Và send thì ta được: Vậy là ta đang đi đúng đường rồi, ta chỉ việc thêm các header khác: Và được kết quả: 

Upload Vulnerabilities TryHackMe

 Các bộ lọc khi Upload file:  Extension Validation (Lọc đuôi mở rộng file): MS Window vẫn dùng cách đọc các đuôi mở rộng để xác định loại file, thường sẽ có whitelist hoặc blacklist cho loại này. File Type Filtering (Lọc file): Khi tải file lên và gửi đi, tệp được xác định loại têp 1 lần nữa:       MIME validation: MIME (Multipurpose Internet Mail Extension):      Loại MIME để tải tệp lên được đính kèm trong tiêu đề của yêu cầu và trông giống như sau:           Magic Number validation: Magic Number là chuỗi byte ở đầu nội dung tệp nhằm để xác định loại      tệp, ví dụ: tệp PNG sẽ có các byte này ở đầu tệp: 89 50 4E 47 0D 0A 1A 0A      Không giống như Windows, hệ thống Unix sử dụng các con số kỳ diệu để xác định tệp; tuy nhiên,         khi xử lý việc tải tệp lên, có thể kiểm tra số ma thuật của tệp đã tải lên để đảm bảo rằng nó an toàn      ...

Safe Opener 2 picoCTF (reverse)

 Ở bài này file tải về là file.class, nếu mở trực tiếp thì ta sẽ được:  Hint của bài này là: " Download and try to decompile the file. " Vậy từ khóa ở đây là decompile, ta tìm thử cách để decompile file class to java: https://www.baeldung.com/java-decompiling-classes  Sau đó mình dùng IntelliJ IDEA để mở file thì được kết quả:  Đến đây thì flag đã hiện rõ rồi: picoCTF{SAf3_0p3n3rr_y0u_solv3d_it_7db9fb8c}

Safe Opener picoCTF (reverse)

 Sau khi tải file code và chạy thử file, ta biết nhiệm vụ của bài này là tìm password:  Nhìn sơ qua code:  Input sẽ được mã hóa và đưa vào hàm "openSafe" để so sánh, và từ "encoder" ta đoán được key sẽ được mã hóa theo base64. Vậy đưa key decode theo base64 thôi!  Thử lại:  Flag: picoCTF{pl3as3_l3t_m3_1nt0_th3_saf3}

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.

patchme.py picoCTF (reverse)

 Bài này sau khi tải 2 file thì mình chạy thử file python:  Vậy là chương trình sẽ hỏi mật khẩu và đoán được nhiệm vụ của chúng ta là tìm mật khẩu.  Quay lại đoạn code python:  ta thấy nó bắt đầu với hàm level_1_pw_check() in ra dòng chữ "Please enter correct password for flag:" và bắt đầu đưa input của ta vào để so sánh với chuỗi cho trước, chuỗi này được ngắn ra và mình chỉ việc ghép nó lại và nhập thử vào input.  Vậy là ta đã có flag.  Tiếp cận theo 1 cách khác, thì chúng ta muốn lấy flag không quan tâm đến logic của đoạn code, ta có thể đổi đoạn code để nó tự in ra phần decryption như sau:  lưu lại và chạy chương trình lại ta sẽ được: 

file-run2 picoCTF (reverse)

 Bài này khác bài file-run1 là mình cần thêm input khi chạy file, và phần gợi ý cũng gợi ý ta cách để thực thi: ./run Hello!