2009-03-20 16 views
19

Làm thế nào các cuộc tấn công tràn bộ đệm được thực hiện?Heap overflow attacks

Trong trường hợp có các cuộc tấn công chồng lên nhau, kẻ tấn công sẽ thay thế địa chỉ trả về hàm bằng địa chỉ của anh ấy.

Điều này được thực hiện như thế nào trong các cuộc tấn công tràn vùng heap? Ngoài ra, nó có thể chạy mã từ heap?

Trả lời

32

Lưu ý điều này thay đổi theo nền tảng và ví dụ của tôi quá đơn giản. Về cơ bản nó đi xuống để quản lý đống có danh sách liên kết có thể bị tràn ngập, và bạn có thể sử dụng các con trỏ danh sách liên kết để ghi đè lên các phần ngẫu nhiên của bộ nhớ của quá trình.

Hãy tưởng tượng tôi có một thực hiện đống ngây thơ mà kiểm soát khối là như thế này:

struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

Khi đống được trả tự do, khối điều khiển này quay ngược lại vào một danh sách các khối tự do, bằng cách sửa đổi tiếp theo/con trỏ trước . Nếu tôi overrun một bộ đệm heap, tôi có thể ghi đè lên con trỏ trong khối điều khiển tiếp theo với dữ liệu tôi kiểm soát. Giả sử tôi ghi đè các liên kết này để trỏ đến một con trỏ tới mã (có lẽ chỉ trong vùng đệm I overran) và đến địa chỉ trả về của hàm trên ngăn xếp. Khi trình quản lý heap cố gắng liên kết khối đó trở lại danh sách được giải phóng, nó sẽ thực sự ghi đè địa chỉ trả về trên ngăn xếp bằng một con trỏ tới mã mà tôi kiểm soát.

Bài viết này có một cái nhìn tổng quan tốt đẹp trên các cuộc tấn công tràn heap: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

Bài viết này mô tả một số xơ cứng mà đi vào quản lý đống Vista để ngăn chặn loại tấn công này: http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: Trên khả năng chạy mã từ heap, có thể. Nhiều nền tảng bây giờ làm cho bộ nhớ heap không thực thi theo mặc định, làm tăng rào cản để nhận được mã tùy ý để chạy. Tuy nhiên, bạn vẫn có thể thực hiện một cuộc tấn công kiểu "nhảy tới libc" - Ghi đè địa chỉ trả về tới một hàm đã biết sẽ thực thi.

+0

Câu trả lời hay - tôi cảm thấy rằng tôi biết rất nhiều về các lĩnh vực lập trình cụ thể của mình, nhưng tôi chưa bao giờ có thể đi sâu vào các trình biên dịch, quản lý bộ nhớ, cơ chế bảo vệ - biết được trách nhiệm của bộ xử lý dừng và khởi động của hệ điều hành. Sau đó, một lần nữa giữa hệ điều hành và mã ứng dụng. Tôi đã đọc hướng dẫn sử dụng intel x86 (vol 1) để che. Làm thế nào bạn đến để tìm hiểu những điều này? –