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.
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.
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"
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
- Phân tích hàm addMilk()
Hàm này sử dụng 3 biến kiểu char là dest, s và v14 để 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.
Từ đó, ta có hàm decode hàm addMilk() như sau:
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()
- Phân tích 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:
- Phân tích 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:
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.
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 !