SVATTT vòng loại – readit – 150 điểm

Bài này cho 1 file pcap, mình cũng không biết làm gì cho tới khi có hint của BTC: “checksum”.

Để ý lại checksum của các packet từ 118.201.62.250 đến 192.168.1.77 ta thấy:

0x6544    ==>   “eD”

0x6243    ==>   “bC”

0x7742    ==>   “wB”

0x6441    ==>   “dA”

0x6440    ==>   “d@”

0x643f    ==>   “d?”

……..

Screenshot from 2016-11-07 21:54:00.png

Để ý thấy mấy cái checksum nó không được random, byte cuối của checksum giảm dần nên mình đoán là nó không ảnh hưởng gì lắm đến flag (cùng lắm nó là số thứ tự 😀 )

Ghép tắt cả các byte đầu của checksum khả  nghi theo thứ tự ta được chuỗi:

str = “ebwddd=E\x88YJIAY?\x88CYMJIAYP\x88AYd\x88YU\x84LUCLxD\x85YDUHYUPM\x83CK;”

 

Ta thấy “ebwddd” giống với format “SVATTT” nên đoán đây chỉ là subtitution đơn giản. Thử các kiểu ta thấy ascii(flag)=184-ascii(str). Chạy 1 vòng for ra được flag:

SVATTT{s0_now_y0u_know_h0w_T0_c4lcul@t3_tcp_chk5um}

SVATTT vòng loại – OTP chatbot – 400 điểm

Lần đầu tiên được thi SVATTT, cảm gíac khá thú vị!

Sở trường của mình là crypto mà vào thi thấy chỉ có 1 bài crypto mà tận 400 điểm, mình cũng ngán nhảy qua làm những bài easy hơn để kiếm điểm nên đến khi cuộc thi kết thúc vẫn không có thời gian để xem kỹ bài này. Về nhà xem lại thì thấy bài này không đến nỗi khó, có thể nói là bài này qúa dễ so với con số 400 điểm. Hoặc cách giải của mình khôgn phải là cách gỉai mong muốn của BTC. Mình nghiêng về ý thứ 2 😀

nc chatbot.svattt.org 5555

Code

Ấn tượng đầu tiên sau khi đọc code là gía trị biến “encrypt_key” chỉ random 1 lần trong 1 session. Do đó, trong 1 lần kết nối ta có thể xem gía trị đó là cố định và chưa biết. Cả Flag và các “res” còn lại đều được encrypt bằng modulus đó (encrypt_key). Còn nếu các bạn không hiểu modulus hay RSA là gì thì tham khảo tại đây

Lan man đủ rồi, phần chính bắt đầu từ đây 😀

Netcat vào, chat “FLAG?” bot sẽ trả về:

enc_flag = encrypt(b2n(FLAG), encrypt_key)

và 1 cái signature, tạm thời mình không quan tâm tới gía trị này.

greet = [“‘sup bro”, “hey”, “*nods*”, “hey you get my snap?”]

Khi chat “hi” con bot sẽ chọn ngẫu nhiên 1 trong 4 string trong greet để encrypt rồi trả về:

enc = encrypt(b2n(res), encrypt_key)

         = b2n(res) ^ 65537 % encrypt_key

==> b2n(res) ^ 65537 -enc =k * encrypt_key

Vì res chỉ mang  4 gía trị khi mình chat “hi” nên enc cũng chỉ mang 4 gía trị và ta có:

b2n(res_1) ^ 65537 – enc_1 = k_1 * encrypt_key = x_1

b2n(res_2) ^ 65537 – enc_2 = k_2 * encrypt_key =x_2

Và điều thú vị ở đây là: gcd(x_1, x_2) CÓ THỂ chính là encrypt_key

Dựa vào đó, ta có thể tìm encrypt_key bằng cách thu thập đủ 4 gía trị “enc” rồi test thử với từng “res”, gía trị nào tầm 100bytes là “chính nó” 😀 (theo thực tế thì trong tất cả gía trị tìm được chỉ có 1 nên không phải buâng khuâng :D)

Cứ thế reset kết nối và lập lại các bước để tìm ra gía trị encrypt_key cho đến khi tìm được encrypt_key có thể factor thành các prime nhỏ. Flag được tính dễ dàng bằng phi(encrypt_key) tính được từ các prime tìm được ở trên.

d = e^-1 % phi

flag = enc_flag ^d %n

Flag: SVATTT{CRT_CRT_CRT_101!!!!}

Đây là số liệu mình tìm được, các bạn tham khảo!

Bài này mình không dùng đến N, signature, hint đề cho cũng như CRT như trong flag đề cập nên không biết đây có phải là 1 expected solution không 😀