[SVATTT 2019 Qual] eznote + curl-me 1
- EzNote (100pts)
Luồng thực thi của chương trình .
- Tạo ra 10 node.
- Yêu cầu nhập secret key
- Lựa chọn 2 option đọc hoặc ghi vào node.
- Thoát.
#Bug:

Khi kiểm tra index của node , dù index không thỏa mãn nhưng hàm không trả về mà vẫn xử lý bước tiếp theo dẫn tới biến buffer chưa được khởi tạo.
#Tính toán stack

3 hàm read_int(), read_note(), write_note() do cùng được gọi từ hàm main , cùng calling convention , cùng k có tham số nên có cùng stack base (rbp) .
Hàm read_int() đọc 0x200 byte vào buffer từ $rbp-0x200 tới $rbp
Hàm read_note() lấy 8 byte cho buffer từ $rbp-8 tới $rbp
Hàm write_note() lấy 8 byte cho buffer từ $rbp-8 tới $rbp
=> Ta có thể điều khiển địa chỉ buffer chưa được khởi tạo bằng hàm read_int()
#Minimal POC

#RCE.
Mình chọn ghi đè địa chỉ hàm atoi thành hàm system trong GLOBAL_OFFSET_TABLE và gọi shell bằng cách read_int(“/bin/sh\x00”)
2. Curl-me 1
Cá nhân mình thấy bài này rất hay, qua nó mình học được rất nhiều thứ của PHP khi làm,debug.
Bài cho ta source-code:
Để trực tiếp bypass qua đoạn check, ta cần một chuỗi $url sao cho sau khi parse_url thì sẽ không chứa xâu flag trong $path. Đồng thời curl_exec $url phải trả về flag/
Sau khi mất 1 tiếng t rao đổi với teamate về chức năng các hàm được sử dụng trong code, không ai có thể đưa ra chính xác các hàm như urldecode,parse_url xử lý những cái gì và hoạt động thế nào và khiến mình phải lôi source của php ra đọc.
Check1 : in_array($parse[“scheme”], array(“file”, “gopher”))
Check này qua bằng cách sử dụng 1 schema là File.
Bạn có thể kiểm chứng trong source code.c của hàm parse_url không có những hàm nào kiểu như tolower hay đại loại vậy để xử lý schema.
Check2: preg_match(“/flag/i”, $path)
Để qua check này mình kiểm tra nhánh parse_path trong hàm parse_url

Từ đó mình nảy ra ý tưởng, mình sẽ làm cho thằng curl nghĩ # là 1 folder và sử dụng path traversal để đọc được file mình muốn.
Và payload cuối cùng như các bạn đã biết.
File:///#/../flag1