Buffer Overflow là gì? Hướng dẫn thực hành từng bước
Tìm hiểu cách buffer overflow hoạt động thực tế với ví dụ C thực sự, sơ đồ stack, và công cụ để bạn tự quan sát nó.
Buffer overflow xảy ra khi một chương trình ghi nhiều dữ liệu hơn vào một khối bộ nhớ cố định so với khối đó có thể chứa. Các byte dư tràn vào bộ nhớ liền kề, và tùy thuộc vào những gì nằm bên cạnh buffer đó, bạn có thể làm hỏng biến, làm sập chương trình, hoặc kiểm soát hoàn toàn luồng thực thi. Đó là một trong những lớp bug lâu đời nhất trong bảo mật phần mềm và vẫn xuất hiện trong CTF, CVE và firmware nhúng ngày nay.
Mẫu dễ bị tấn công
Dưới đây là một ví dụ kinh điển trong C:
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpy sao chép bất kỳ chuỗi nào bạn truyền vào buffer, không có kiểm tra giới hạn. Nếu argv[1] dài hơn 64 byte, quá trình sao chép tiếp tục vượt quá cuối của mảng. Trên stack, buffer nằm dưới các biến cục bộ khác, các thanh ghi đã lưu, và cuối cùng là địa chỉ trả về cho CPU biết nơi để nhảy sau khi greet() kết thúc. Ghi đè địa chỉ trả về đó bằng một địa chỉ bạn kiểm soát, và bạn kiểm soát những gì chạy tiếp theo.
Tại sao cái này vẫn compile và chạy
C và C++ không thực hiện kiểm tra giới hạn tự động trên mảng thô. Các hàm như strcpy, gets, sprintf, và strcat sẽ viết quá cuối của buffer vì chúng chỉ quan tâm đến null terminator hoặc độ dài nguồn, chứ không phải kích thước thực tế của đích. So sánh với strncpy hoặc snprintf, chúng nhận một tham số kích thước rõ ràng và dừng ở đó. Lỗ hổng không phải thực sự
Viết với hỗ trợ của AI, được xem xét và đăng bởi Michal Pilch (CISSP), Korra Studio.
Đây là một ghi chép từ cơ sở kiến thức Korra Studio — nền tảng kết hợp mỗi chủ đề với phiên hỗ trợ 1-kèm-1.
Bắt đầu miễn phíarrow_forward