🐥Ubuntu rar - FUSec 2023

Tôi nhận được vài thông tin sau về file:

ELF 64-bit
No canary và no pie

Tôi nghĩ khả năng cao là Buffer Overflow

Sau khi chạy chương trình tôi thấy chương trình sẽ zip các số trùng nhau và liền kề nhau lại và đưa ra kích thước + vài thông tin đằng sau khác.

Ví dụ như đây

Analysis

main()

compress_buffer()

compress_single_byte()

hex_dump()

Chương trình còn 1 hàm to_byte() nữa nhưng sau khi đọc hết chương trình tôi thấy nó là hàm trơ :v

Nhìn vào thằng oở đây, chắc hẳn bạn cũng nhìn ra là nó bị overflow rồi :>>

Để mà o += 2 thì bạn phải hoàn thành việc thực thi hàm compress_single_byte . Overview tiếp hàm compress_single_byte . Thì bạn có thể thấy hàm này xử lí các kí tự trùng lặp, nó kết thúc khi gặp kí tự khác với kí tự liền trước và return về kích thước của chuỗi lặp đó.

Vậy nếu pây giờ tôi nhập như này "abababababab" thì sao?

Rõ ràng là tôi nhập vào 13 kí tự nhưng nhận tới 27 kí tự ==> phần output[o] đã xảy ra overflow nếu tôi nhập "ab"*120.

Exploit

Setup payload:

Phần khoanh đỏ: Địa chỉ của output

Phần khoanh vàng: Địa chỉ của buffer

2 phần khoanh xanh: địa chỉ return pointer

Tiến hành ghi đè:

Kết quả:

Nhìn trên kia bạn có thể hình dung đó giống như 1 câu lệnh hex $rsp.Thì có thể thấy phần output của tôi đã bị ngắt quãng, và nó đã tiến hành ghi đè tiếp xuống dưới vào phần buffer ban đầu.

Vậy điều gì đã xảy ra?

Sau khi để ý kĩ hơn thì tôi thấy thằng o đã bị ghi đè ---> sự thay đổi index ---> ghi đè không đúng ý muốn. Đó là lí do nó nhảy xuống dưới phần buffer và ghi đè tiếp.

Chỉnh 1 xíu ở payload:

Chưa cần quan tâm 5 dòng đầu, hãy nhìn từ dòng thứ 6. Tôi đã chỉnh kích thước của payload này sao cho: dài 240 bytes buffer và dài 248 bytes output.

bytes thứ 249 chính là bytes ghi đè biến o, và tôi sẽ ghi đè nó thành index của ret pointer để ghi đè nên nó.

stack trước khi ghi đè o
stack sau khi ghi đè o

Biến o bây giờ có giá trị là hex 0x106 == vị trí của <main+204>

Bây giờ tôi có thể return về một chỗ tùy ý. Do trên file elf có gadget quan trọng như pop rdi nhưng không các hàm system, sh nên tôi sẽ phải dùng kĩ thuật ret2plt mục đích để leak libc address sau đó dùng nó để khai thác.

Đây là thứ bạn cần

Xử lí byte leak và rồi hãy làm tiếp tương tự như trên sau khi return về main 1 lần nữa.

Oke
Done

QUOTE: Khi làm bài overflow, thì phải biết được là nó overflow chứ đừng cắm đầu vào over - Sifu

Last updated