Hola CTF 2023
HOLA_CTF_2023
CRYPTOGRAPHY WRITEUP
Author:
Pham Quoc Trung
Used Language:
Python3
Challenge Solutions:
Cat Linh – Ha Dong cypher
Will you conquer this encryption? Join the ride, crack the code, and emerge as the decryption master!
FLAG Format: EHC{XXX}
Attachment: chal.txt
ETR_c1r_YH{h_4LFn3Cp3_535}C313_h14Ở đây, mình để tên là Cát Linh – Hà Đông bởi mình sử dụng rail-fence cipher (mã hóa đường tàu) để mã hóa flag. Các bạn chỉ cần ném nó lên một trang web bất kì hoặc giải tay nếu muốn thử thách bản thân.
Flag: EHC{Th3_R41L_F3nc3_C1ph3r_15_345Y}
221B
I found a piece of paper on the desk of a friend who is passionate about playing the violin. I have illustrated it in the image below. Can you help me solve it?
FLAG Format: EHC{XXX}
Attachment: chal.jpg
Tất cả những gì mình ghi trong mô tả, cũng như tên challenge là để cho các bạn có thể tìm ra được đây là Dancing Man Code trong bộ tiểu thuyết trinh thám nổi tiếng “Sherlock Holmes”. Vẫn như cũ, bạn có thể dùng một trang web bất kì để giải hoặc giải tay. Trong bài này thì mình nghĩ 2 cách đó cũng không hơn nhau là mấy. Kết quả sau khi giải mã chal.jpg:
Đến đây, chúng ta sẽ dùng ROT14 để giải mã:
Để tăng thêm chút thử thách thì mình đã uppercase nó lên để làm flag. Khá thú vị đúng không :v Một số trang web mặc định giải Dancing Man Code ra uppercase từ đầu, sẽ là may mắn nếu các bạn chọn nó. Trong quá trình thi mình cũng đã hint về case để các bạn có thể giải được nhiều hơn.
Flag: EHC{BRILLIANTDETECTIVE}
Invisible Clarabelle:
Mrs. Clarabelle gave me this code but I don't know how to solve it. I spent almost 2 days 16 hours thinking. Maybe I need a quieter space so I can think of a solution. How about you?
FLAG Format: EHC{XXX}
Attachment: chal.txt
Bài này mình sử dụng 2 ngôn ngữ khá thú vị là Cow Language và White Space language. Đó cũng là lí do tại sao tên challenge là Invisible Clarabelle (Clarabelle là tên 1 nhân vật bò). Mình cũng sử dụng thêm base64 để cho challenge có một khởi đầu dễ dàng (Mình cũng có thêm “2 days 16 hours” vào đề bài để ám chỉ con số 64). Đầu tiên mình sẽ decode base64 và thu được:
Trông khá thú vị phải không. Tiếp theo là dùng một công cụ bất kì để giải được đống Cow Language này:
Ở đây thoạt nhìn có vẻ các bạn sẽ tưởng giải mã không ra gì. Thực chất chỉ là bạn không thể nhìn thấy ký tự whitespace.Bôi đen các bạn sẽ thấy được chúng. Giờ chỉ cần tìm trang web để giải mã và các bạn sẽ có được flag.
Flag: EHC{c0w_l4ngu4g3_is_s0_fun}
Riven-Shaco-Alistar
In Runeterra, several champions were talking to each other. You can know their names through the file below. Can you guess what Malphite said? Oh, don't worry, guessing the words of someone who doesn't even know how to use bitwise operators is extremely easy.
FLAG Format: EHC{XXX}
Attachment: chal.py
Mình để tên challenge như vậy để các bạn có thể nhận ra nó là mã hóa RSA mà chưa cần phải sờ đến đống code đau đầu (Sau đó mình cũng có hint luôn cho các bạn).
Để nói về challenge RSA này, mình đã cho các bạn sẵn e, d và cipher. Việc các bạn cần làm là tính ra được message ban đầu được gen ngẫu nhiên và chỉ bao gồm ascii_letters và digits. Nếu đúng, bạn sẽ nhận được một đoạn mã hóa của flag. Mình sẽ nói về nó sau. Trước hết về bài toán RSA của chúng ta, các bạn có thể tra google về việc giải mã RSA khi có e, d, c. Tuy nhiên mình vẫn sẽ phân tích về cách của mình như sau:
Trong mã hóa RSA, chúng ta đã biết rằng:
Điều này cho thấy d là nghịch đảo modulo của e với phi(n). Từ tính chất của nghịch đảo modulo, ta sẽ có:
Hay (p-1),(q-1) là các ước của ed-1
Từ đó, ta có thể tìm tất cả các ước của ed-1, lấy các ước mà nhỏ hơn 1 đơn vị so với các số nguyên tố 128-bit (p, q bài này là 128-bit). Các kết quả thu được sẽ đem cộng thêm 1 đơn vị. Với những kết quả đó ta sẽ tạo nên những cặp p,q và thử giải mã đối với từng cặp. Nếu giải mã ra output chỉ bao gồm chữ và số thì đó là kết quả đúng. Có thể bạn đọc sẽ không hiểu ngay. Bạn có thể thử viết từng bước ra, sẽ thấy nó rất là dễ.
Vấn đề ở đây là kể cả bạn ra được đúng message, flag được trả về là dạng bị mã hóa bởi hàm encrypt_flag. Nếu bạn có tìm hiểu về cryptography, bạn sẽ nhận ra nó sử dụng toán tử XOR. Nếu chưa biết, hãy đi tìm hiểu một chút để có thể hiểu đoạn sau nhé.
Cụ thể thì ở đây, mình đã XOR từng bytes của flag với từng bytes secret key của mình. Nhưng mình đã lấy secret key chỉ có 6 ký tự, ngắn hơn nhiều so với flag, nên mình đã viết để cho khi XOR xong đến bytes thứ 6, bytes thứ 7 của flag sẽ lại quay về XOR với bytes đầu của secret key. Kết quả thu được mình sẽ cho in ra dưới dạng hex.
Để có thể giải mã được, bạn có thể brute-force key. Mình chưa thử, không biết nếu treo 8 tiếng thi đấu có thể brute-force ra không. Tuy nhiên thay vì brute-force, chúng ta sẽ tìm cách leak ra vài ký tự của flag. Toán tử XOR có tính đối xứng, nghĩa là giả sử bạn có A ^ B = C thì tương đương A = B ^ C và B = A ^ C. Vậy áp dụng tính chất này ra sao? Đây là lúc bạn phải để ý đến format của flag: EHC{XXX} . Chúng ta luôn biết 4 ký tự đầu của flag là EHC{. Với nó, bạn hoàn toàn có thể leak được 4 ký tự đầu của secret key bằng cách XOR chúng với 4 ký tự đầu của đoạn mã hóa. Bằng kỹ thuật này, bạn sẽ tìm ra được 4 ký tự đó là “TRUN”. Hãy nhớ về tên người tạo ra challenge này “TRUNGPQ”, bạn sẽ có được secret key và lấy được flag
Solution: solve.py
Flag: EHC{0mg_y0u_mu5t_b3_an_r54_ch4ll3ng3r}
Postscript: Một số bạn sẽ cảm thấy các challenge của mình hơi đơn giản. Giải HolaCTF này mình muốn tất cả các bạn kể cả các bạn newbie có cái nhìn ban đầu cũng như có chút hứng thú với Crypto, nên mình đã không đánh đố lắm. Rất mong các bạn sẽ quan tâm tới mảng này ^^
© 2023,Pham Quoc Trung. All rights reserved.
Last updated