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: 

file-run1 picoCTF (reverse)

 Ở bài này, 2 hint gợi ý khá rõ rồi:  Trên Linux:  chmod +x <file_name> dùng để cấp quyền thực thi tập tin đó.  ./<file_name> để thực thi tập tin đó, ở đây là file binary. Làm theo hướng dẫn ta sẽ có được flag.

speeds and feeds picoCTF (reverse)

 Với bài này ta thấy từ phần gợi ý đã có đường đi tiếp theo, đó là dùng ncat để xem địa chỉ đó nói gì: sau khi chạy ta có thể thấy 1 loại các dòng như này. Quay lại phần hint  search google thì thấy ngôn ngữ để chạy máy CNC là G-code, ta đoán đây là 1 đoạn code bằng ngôn ngữ G-code. Tìm 1 web run được ngôn ngữ G-code: https://ncviewer.com/ và ta có kết quả

vault-door-1 picoCTF (reverse) java

 Bài này đọc source code ta thấy có hàm so sánh các kí tự theo vị trí, gợi ý của pico là charAt() ta cũng hiểu là password sẽ được so sánh từng kí tự nhập vào, việc còn lại là sắp xếp các kí tự đó sẽ ra pass cần nhập.  flag: picoCTF{d35Cr4mbl3_tH3_cH4r4cT3r5_ff63b0}

vault-door-training picoCTF (reverse) java

 Đọc code ta thấy password sẽ có dạng "picoCTF{" + chuỗi, mặt khác phần chuỗi dùng để so sánh cũng đã có trong code nên ta có thể lấy ra để nộp thôi :>>>

ARMssembly 1 picoCTF (reverse)

 Bài này mình chỉ đọc mã nguồn chứ chưa biết cách debug khác tiện dụng hơn :)) Trình độ đọc Assembly của mình đang khá kém nên mọi người không nên tin 100% phần giải thích là đúng hoàn toàn :)  Từ main: ta hiểu đoạn code này để tạo không gian lưu trữ và nhập input người dùng được lưu vào w0  Tiếp sau đó là lệnh "bl func" nên ta xem đoạn mã nhãn "func":  Sau đoạn code này ta biết w0 sẽ là 1813 - a và quay về main:  Sau khi quay về main ta thấy lệnh "cmp w0, 0" là lệnh so sánh w0 với 0. Nếu w0 = 0 thì trả về 1, w0 != 0 thì trả về 0. Bên dưới có "bne .L4" (branch if not equal) tức là nếu w0 != 0 thì thực hiện L4 mà L4 sẽ dẫn ta đến LC1 trả về "You lose" nên mục đích của ta là vượt qua mà không nhảy đến L4 để thực hiện lệnh tiếp theo là nhảy để LC0 trả về "You win" hay nói cách khác ta cần w0 = 0. Vậy 1813 - a = 0 hay a = 1813.  Vậy đáp án là picoCTF{00000715}   //nhớ ghi đủ 8 chữ số nhé :)) 

Transformation picoCTF(reverse)

Đầu tiên khi tải file về ta thấy 1 dòng chữ rất là ố dề :)) Description và hint bài này dẫn ta nghĩ đến việc sẽ là 1 dạng mã hóa nào đó.  Tìm thử các hàm ord() và chr() ta biết được hàm này sẽ là hàm đưa 1 kí tự về mã Ascii và ngược lại.  Bây giờ thử viết 1 hàm chuyển kí tự này về chuỗi số Ascii: Đọc phần Description ta thấy, dòng chữ này sẽ được so sánh với flag theo hàm:  .join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)]) hay là 28777 =  chr((ord(flag[0]) << 8) + ord(flag[0 + 1]))) vì flag sẽ có dạng picoCTF{} nên ta đoán flag[0]='p' và flag[0+1]='i' và chạy thử: ta thấy đầu ra giống nhau. Vậy bây giờ có 2 cách: 1 là ta sẽ viết 1 đoạn code dịch ngược các mã Ascii về unicode, 2 đơn giản hơn là ta chạy tất cả các chữ unicode theo đoạn mã trên mà nếu nó bằng mã Ascii sẽ lấy chữ đó. 

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_t...

crackme.py picoCTF (reverse)

 Với bài này khi đọc code, ta sẽ thấy có 2 def là choose_greatest() và decode_secret():  đọc đoạn code  choose_greatest() có vẻ chỉ có việc print ra, còn decode_secret sẽ decode input.  Đoán được secret ở đây là biến bezos_cc_secret nên ta chỉ việc chạy decode_secret với đầu vào là bezos_cc_secret ta sẽ decode được. 

Lời nói đầu

 Mình là Nguyễn Tùng Dương, hiện đang là sinh viên Kỹ thuật máy tính K66 HUST, cựu học sinh chuyên Toán k47 chuyên Phan Bội Châu, Nghệ An. Mình có niềm đam mê với An toàn thông tin, nhưng năm nhất thì chưa được học nhiều về chuyên ngành, vậy nên blog này là những chia sẻ về quá trình và chặng đường tìm hiểu về Cyber Security. Vì là tự tìm hiểu và hiện tại không có nhiều road map để theo ngành này, vậy nên nếu có gì sai sót xin mọi người góp ý và bỏ qua cho mình.  Mình mong là blog sẽ có chút kiến thức hay truyền động lực cho bạn tiếp tục theo ngành này.  Instagram: duongn.15 Facebook: www.facebook.com/tungduong03/