Buffer OverFlow
Buffer OverFlow (Lỗi tràn bộ đệm)
Trong bài này mình xin phép lấy source của DownUnderCTF 2021 từ 1 anh trên mạng 😁
Các bạn lưu ý là chúng ta có Stack OverFlow(Bộ nhớ tĩnh) và Heap OverFlow (Bộ nhớ động)
I. Overview
Thứ mà bạn nhận được:
Đọc qua 1 lượt thấy mảng v4 cấp phát 24 phần tử dạng character và 1 variable v5. Nhưng điều bất thường ở đây bạn có thể thấy đó là chương trình yêu cầu nhập vào v4 nhưng mà lại lấy v5 mang đi so sánh 🙂. Bạn chưa phải biết gì vội hãy check xem hàm gets có chức năng gì ?
Khi bạn đọc xong dòng trên bạn nghĩ điều gì sẽ xảy ra nếu mình viết 25 phần tử + "\x00" or NULL byte?
Follow tiếp phần checksec của trình gỡ lỗi gdb-peda của nó:
Thì bạn có thể thấy chế độ CANARY đã bị disable thì ta có thể kết luận chắc chắn rằng đây là lỗi Buffer OverFlow
2. Analysis
Thì từ ảnh ida64 ở trên bạn có thể thấy điều mình cần làm là gì:
Đó là:
Debugging nó:
Hy vọng bạn hiểu chúng có chức năng gì. Nếu không hiểu bạn có thể tham khảo về ngôn ngữ lắp ráp assembly. Sau đó quay lại đọc.
Đại loại là phần này nó sẽ nhập vào gets và đến khi conditions thỏa mãn và câu lệnh system được gọi.
Đặt breakpoint tại hàm gets b* <address> và lúc nó nó bắt đầu so sánh. Có thể thấy v5 == ... ở ảnh trên nó tương đương với cmp QWORD.... ở ảnh bên dưới như vậy có thể đoán v5 được lưu trữ tại [rbp-0x8] có địa chỉ: 0x7fffffffdf58 (bạn có thể dùng câu lệnh bên dưới để xem)
Khi run chương trình với r thì bạn có thể thấy được địa chỉ của argument[0]: 0x7fffffffdf40
Nhấn n để chạy đến câu lệnh tiếp theo và tại đây nó yêu cầu nhập input. Bạn có thể tính được khoảng cách từ v4 ==> v5 bằng cách lấy địa chỉ của v5 trừ đi địa chỉ của v4 sau đó overflow bytes đến v5
Vậy mình sẽ bắt tay vào viết payload cho chương trình này luôn.
Comments
Post a Comment