[Sharif University CTF Quals 2013] one Line encoder For Specialist pRogrammer (crypto200)

 

Có thể để ý ngay những chữ viết hoa trong tên bài, nó là LFSR, nhưng kệ boss

Nội dung chính

Ở bài này, chúng ta có một hàm encode, đầu vào là một xâu text và một khóa key. Dựa vào kết quả trả về của hàm len(key) và set(key), ta biết được 2 thông tin:

  • Key dài 9 ký tự.
  • Key chỉ chứa ‘0‘ và ‘1‘.

Như vậy, mình tin chắc rằng mình sẽ làm được, với lựa chọn cho bước đường cùng là brute key để submit. Kế hoạch cụ thể mình đã có, đó là submit từng key cách nhau 10s, tức 1 phút được 6 key, một giờ được 360 key, khoảng 2h sẽ xong. Nếu vẫn bị BTC phát hiện thì đẩy interval lên và cắm máy qua đêm sexy_girl

Tà đạo đã xong, giờ là chính đạo. Tiến hành viết lại cái hàm encode của họ như sau (nói thật là mình mất không hề ít thời gian để đọc về lambda, map và reduce, vì dù nó đơn giản thật nhưng khi áp dụng vào bài cho thì mình lại hơi bị loạn, khá ức chế):

Có thể thấy thuật toán mã hóa là rất đơn giản, byte-to-byte bằng phép toán XOR huyền thoại. Chúng ta viết hàm decode như sau:

và tiến hành brute để tìm key:

Output chỉ cho ra một giá trị duy nhất khả quan (thì tất nhiên là vậy rồi emo_popo_sweat):

flag = md5(key) = d2fa68bb166dde1c720bd0c8fd665bae.

[Sharif University CTF Quals 2013] too hard? (crypto300)

Chúng ta cần tìm một số x sao cho:

(11111111111111111111112 ^ x) % 123456790123456790123454320987654320987654321 = 1173805180904286755555543817503746512689

Nội dung chính

Đây là một bài mà ngay khi đọc đề, trong trái tim nhân hậu và đầy thiện lương của mình sớm phát sinh hai luồng suy nghĩ trái chiều:

  • Một là mình có thể làm được nó emo_popo_sure
  • Hai là, nếu mình có thể làm được nó chỉ sau ánh mắt nhìn đầu tiên, thì sao nó lại có giá 300 điểm?

Một lần nữa lại buộc phải sống chậm lại để thấy được rằng, chẳng có gì là công bằng, chẳng có gì là hoàn hảo cả. Một bài 300 điểm có thể dễ, một bài 100 điểm có thể khó, sống tử tế thì thường ế mà sống khốn nạn thì nhiều người ngó…

Sau vài ba phút lang thang trên Google, đọc qua biết bao là bí kíp Toán học trên trời dưới bể, Féc Ma rồi Ơ Clít, ghi ghi chép chép trên cuốn vở ô ly chi chít chữ, đi đến một phát hiện quan trọng như đang mộng:

Output:

Tính hiệu của chúng theo từng cặp, lạ kỳ thay khi tất cả đều bằng 11111111111111111111111 surrender

Ok, case closed emo_popo_look_down

Chúng ta xác định x bằng cách:

y = (1173805180904286755555543817503746512689 - 11111111111111111111112) / 11111111111111111111111
  = 105642466281385807

x = y + 1
  = 105642466281385808

flag = md5(x) = d0cacf9701b449aae0b236f1626d5688.