- vừa được xem lúc

Giải bài Tea trong SHELL CTF

0 0 40

Người đăng: Đại Bi

Theo Viblo Asia

S.H.E.L.L CTF

tea - 268 points

It's tea time. The flag format is shellctf{...}

Các bạn có thể tải tập tin tại đây: https://github.com/LaoDaiDia/CTF/raw/b0af1f25aa9c077e91be7e50f4b003f20156c58d/2022/shellctf/tea

Công cụ sử dụng: Kali.Linux_x64.v2021.1, IDA Freeware 7.7

Đầu tiên ta chạy thử tập tin tea trên môi trường Kali linux để có cái nhìn đầu tiên về challenge.

Chạy thử tập tin tea trên Kali linux

Nhận thấy ở challenge này yêu cầu người chơi cần truyền vào 1 flag.
Sử dụng trình xem mã giả (Pseudocode) trong IDA để xem và phân tích chi tiết.

Mở tập tin trên IDA

Dễ thấy chương trình sử dụng 5 hàm:

  • boilWater(): gán chuỗi nhập vào từ người dùng vào biến pwd

Sau đó chương trình sẽ kiểm tra chuỗi nhập vào có đúng 32 ký tự hay không.

  • addSugar(), addTea(), addMilk(): dùng để "xáo trộn xào nấu" chuỗi pwd
  • strainAndServe(): so sánh chuỗi pwd sau khi xáo trộn với chuỗi có sẵn, nếu đúng thì in ra "yep, that's right"

strainAndServe

Từ đó suy ra, bài này cần tìm một chuỗi pwd nhập vào (cũng chính là flag) thoả điều kiện:

  • Có chiều dài 32 ký tự
  • Có dạng shellctf{...}
  • Sau khi biến đổi qua các hàm thì có kết quả như chuỗi có sẵn

Hướng giải quyết bài này là đi từ chuỗi kết quả có sẵn trở ngược lên

  1. Phân tích hàm addMilk()

hàm addMilk()

Hàm này sử dụng 3 biến kiểu chardest, sv14 để lưu chuỗi tạm và biến đếm v3. Hàm strncat() dùng để nối chuỗi.

  • Hàm while ở dòng 40: kiểm tra và thực hiện gán từng ký tự từ đầu chuỗi pwd đến khi gặp ký tự 5 (có mã ascii là 53) thì dừng, gán chuỗi kết quả vào dest
  • Hàm while ở dòng 42: tiếp tục kiểm tra và gán các ký tự tiếp theo của chuỗi pwd đến khi gặp ký tự R (có mã ascii là 82) thì dừng lại, gán chuỗi kết quả vào s
  • Hàm while ở dòng 44: gán các ký tự còn lại của chuỗi pwd vào v14
  • Code từ dòng 46 -> 50: nối v14, dest, s theo thứ tự và gán cho pwd.

Phân tích chuỗi pwd ở hàm addMilk()

Từ đó, ta có hàm decode hàm addMilk() như sau:

re-addMilk()

Biến i trong hàm đóng vai trò là biến "chạy" do lúc này ta không biết điểm đầu và cuối của chuỗi pwd ban đầu truyền vào hàm addMilk()

  1. Phân tích hàm addTea()

hàm addTea()

Hàm này chia chuỗi pwd làm 2 nửa để xử lý:

  • Nửa đầu sẽ biến đổi theo công thức ở dòng 26
  • Nửa sau sẽ biến đổi theo công thức ở dòng 34 Ta có chương trình hàm decode hàm addTea() như sau:

re-addTea()

  1. Phân tích hàm addSugar()

hàm addSugar()

Hàm addSugar() này đơn giản là chuyển các ký tự ở vị trí lẻ ra đầu, các ký tự ở vị trí chẳn ra sau, duyệt theo thứ tự từ trái sang phải của chuỗi truyền vào.

Ta có chương trình hàm decode hàm addSugar() như sau:

re-addSugar()

Kết quả của chương trình reverse sẽ thu được nhiều key, những key này đều bypass được các hàm addSugar(), addTea(), addMilk() để in ra chuỗi ký tự "yep, that's right". Tuy nhiên, key có dạng shellctf{} mới chính là flag cần tìm.

Kết quả trả về của chương trình re_tea.py

Các bạn có thể xem và tải chương trình decode tại: https://github.com/LaoDaiDia/CTF/blob/main/2022/shellctf/re_tea.py

Cảm ơn mọi người đã đọc !

Bình luận

Bài viết tương tự

- vừa được xem lúc

Code sạch, Code dễ phát triển,... Lập trình viên đã biết về Code an toàn chưa??? (Phần 2)

. Như đã hứa ở cuối phần 1 thì trong phần 2 này mình sẽ nói về các lỗ hổng: PHP Type Juggling, Hard Coded, Xử lý dữ liệu quan trọng tại Client side, Sử dụng bộ sinh số ngẫu nhiên không an toàn,... Giờ thì tiếp tục với Secure Coding thôi . 3. PHP Type Junggling. Lỗ hổng typle junggling xảy ra do PHP

0 0 48

- vừa được xem lúc

Code sạch, Code dễ phát triển,... Lập trình viên đã biết về Code an toàn chưa??? (Phần 1)

. Văn vẻ mở đầu. Chắc hẳn các bạn sinh viên khi học các môn lập trình trên trường đều ít nhiều được nghe đến khái niệm Code sạch - Clean code: là cách đặt tên biến, tên hàm; cách code sao cho dễ đọc, đễ hiểu.

0 0 42

- vừa được xem lúc

[Write-up] Intigriti's December XSS Challenge 2020

Giới thiệu. Gần đây mình có làm thử một bài CTF về XSS của Intigriti (platform bug bounty của châu Âu) và nhờ có sự trợ giúp của những người bạn cực kỳ bá đạo, cuối cùng mình cũng hoàn thành được challenge.

0 0 47

- vừa được xem lúc

Java deserialization - Write up MatesCTF 2018 WutFaces

Mở đầu. Bài ctf này là 1 bài rất hay về lỗ hổng java deserialization mà các bạn muốn tìm hiểu về lỗ hổng này nên làm.

0 0 161

- vừa được xem lúc

Code sạch, Code dễ phát triển,... Lập trình viên đã biết về Code an toàn chưa??? (Phần 3)

Chắc hẳn sau phần 1 và phần 2 thì mọi người đã hiểu được mức độ quan trọng của việc đảm bảo an toàn cho sản phẩm ngay từ khi thiết kế và lập trình rồi. Ở phần 3 này, chúng ta sẽ tìm hiểu về 1 lỗ hổng

0 0 49

- vừa được xem lúc

Lần này vẫn có source code, nhưng hack thì dễ hơn

Bài trước (Đây là bài trước: https://viblo.asia/p/khi-co-source-code-roi-thi-hack-co-de-khong-maGK7G8AKj2), mình có đưa một câu hỏi là Khi có source code rồi thì hack có dễ không?.

0 0 57