Em tên là Thái Vĩnh Đạt (tên discord là tvdat20004), hôm 22/7 vừa rồi em có tham gia miniCTF do clb Wanna.W1n tổ chức và em được hạng 3. Em làm được 2 bài thuộc mảng Crypto và sau đây em xin trình bày write-up cho 2 bài đó ạ.
flipping login
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
- Tóm tắt đoạn code:
- Server sẽ cho ta 3 lựa chọn: Login(1), Register(2), Quit(3).
- Khi chọn Register, server cho phép ta nhập
name
, sau đó nó sẽ tạo một login_token
. login_token
chính là base64 của kết quả sau khi mã hóa AES_CBC của một json:{ "admin": False, "name": name }
- Tùy chọn login cho phép ta nhập vào một
login_token
. Server sẽ encode base64, sau đó decrypt AES_CBC và loads json token
. Để nhận được flag thì token
phải có key admin
ứng với giá trị True.
- Vậy điểu mình cần làm để lấy được flag là phải gởi token như yêu cầu ở trên. Với tên đề bài là
Flipping login
cộng với việc đã làm bài flipping cookie trên Cryptohack thì em nghĩ ngay đến kĩ thuật bit flipping attack. Trong quá trình làm bài em có tham khảo ở link này
- Nhìn chung thì kĩ thuật này cho phép ta modify một vài byte trên chuỗi ciphertext (thực ra là iv + ciphertext) để thu được ciphertext mới và sau khi decrypt ta thu được plaintext như mong muốn. Ở đây mình cần modify sao cho từ plaintext là
{ "admin": false, "name": name }
thành plaintext { "admin": true, "name": name }
, tức là chuyển chuỗi false
thành true
. Mình sẽ tiến hành flip từng byte như sau:
- Ví dụ để chuyển 'f' thành 't', em sẽ xor bit thứ 10 (vị trí của 'f' trong plaintext) với
(ord(f)^ord(t))
.
- Lặp lại quá trình đồi với các bit tiếp theo cho đến khi flip hết chuỗi 'false' thành 'true '.
- Python implementation:

- Flag:
W1{CBC_bit_flipping_attack_can_flip_your_system_https://tsublogs.wordpress.com/2015/07/18/bit-flipping-attack-on-cbc-mode}
Weird Primes

- chall.py, output.txt
- Hint: 'Bruteforcing each digit since number of possible bytes for each prime is small'.
- Sau khi đọc xong hint và một hồi suy nghĩ, em cảm thấy nó "khá giống" với parital bit leak dạng "random known bit of p and q" mà em đã làm trước đây (chi tiết về nó em để ở đây, 4.3.1, trang 21). Tuy thoạt nhìn thì thấy 2 bài có vẻ rất khác, nhưng ý tưởng brute-force lại hoàn toàn giống nhau, đều sử dụng "branch and prune algorithm".
- Cụ thể, em sẽ brute-force từng byte(do p và q được tạo từ chuỗi byte gồm 128 số) của p và q theo thứ tự từ LSB đến MSB.
- Mô tả thuật toán:
- Xét cặp LSB của p và q, có tất cả 10x10 cặp có thể có. Bruteforce hết không gian mẫu đó cho đến khi gặp
p.q mod 256 = n mod 256
(p,q đang chỉ có 1 byte LSB)
- Xét tiếp byte sau đó, gọi là dp và dq, cũng có 10x10 cặp có thể có. Bruteforce hết không gian mẫu đó cho đến khi gặp
p.q mod (256**2)= n mod (256**2)
(khi này p,q có 2 byte LSB)
- Lặp lại quá trình cho đến khi tìm được 128 byte của p và q.
- Python implementation:

- Flag:
W1{branch_and_prune_is_sometime_very_useful!!!!}