2009-07-13 53 views

Trả lời

121

Ngăn xếp ngăn xếp đề cập cụ thể đến trường hợp khi chồng thực thi vượt quá bộ nhớ được dành riêng cho nó. Ví dụ, nếu bạn gọi một hàm mà đệ quy gọi chính nó mà không bị chấm dứt, bạn sẽ gây ra tràn ngăn xếp khi mỗi cuộc gọi hàm tạo một khung ngăn xếp mới và ngăn xếp cuối cùng sẽ tiêu thụ nhiều bộ nhớ hơn là dành riêng cho nó.

Tràn bộ đệm đề cập đến bất kỳ trường hợp nào trong đó một chương trình ghi vượt quá bộ nhớ được cấp phát cho bất kỳ bộ đệm nào (kể cả trên heap, không chỉ trên ngăn xếp). Ví dụ, nếu bạn viết qua phần cuối của một mảng được cấp phát từ heap, bạn đã gây ra tràn bộ đệm.

+3

Vì vậy, nó sẽ là công bằng để nói rằng một tràn ngăn xếp là một loại cụ thể của tràn bộ đệm? (Tôi nghĩ rằng ngăn xếp là một phần của bộ nhớ được phân bổ tại thời gian chạy) –

+0

Cũng có thể thêm một mô tả của một bộ đệm tràn quá, vì nó liên quan chặt chẽ. –

+1

Thuật ngữ "tràn ngăn xếp" thường được sử dụng để mô tả tràn bộ đệm xảy ra trên ngăn xếp. – Oktalist

5

Stackoverflow là khi kích thước của stack cho một sợi vượt quá kích thước stack cho phép tối đa cho chủ đề đó.

Lỗi tràn bộ đệm là khi giá trị được ghi vào bộ nhớ hiện không được chương trình phân bổ.

11

stack overflow: bạn đã đặt quá nhiều thứ trên stack cho bộ nhớ được phân bổ cho các chủ đề hiện tại

Buffer overflow: Bạn đã vượt quá kích thước của bộ đệm hiện phân bổ của bạn và đã không thay đổi kích cỡ nó để phù hợp (hoặc không thể thay đổi kích thước thêm).

3

Buffer overflow thường là viết tắt của bất cứ lúc nào một bộ nhớ đệm được truy cập vượt quá giới hạn của nó cho dù stack hay heap. Một tràn ngăn xếp có nghĩa là ngăn xếp đã vượt quá giới hạn được phân bổ và trên hầu hết các máy/hệ điều hành đang chạy trên heap.

18

Sự khác biệt chính là biết sự khác biệt giữa ngăn xếp và bộ đệm.

Ngăn xếp là không gian dành riêng cho chương trình thực thi để thực thi. Khi bạn gọi hàm, thông số và thông tin trả về sẽ được đặt trên ngăn xếp.

Bộ đệm là bộ nhớ đệm chung được sử dụng cho một mục đích duy nhất. Ví dụ, một chuỗi là một bộ đệm. Nó có thể được chạy bằng cách viết nhiều dữ liệu hơn vào chuỗi hơn là được phân bổ cho.

3

Bạn không có ý nói "sự khác biệt giữa ngăn xếp và bộ đệm là gì?" - điều đó sẽ dẫn bạn đến thông tin chi tiết hơn nhanh hơn. Một khi bạn đã nhận được rằng đến nay, sau đó bạn có thể suy nghĩ về những gì nó có nghĩa là tràn tất cả những điều này.

0

Hầu hết những người đề cập đến tràn bộ đệm có nghĩa là lưu lượng chồng lên nhau. Tuy nhiên, tràn có thể xảy ra ở bất kỳ khu vực nào không chỉ giới hạn trong ngăn xếp. Chẳng hạn như heap hoặc bss. Một tràn ngăn xếp được giới hạn để ghi đè địa chỉ trả về trên ngăn xếp, nhưng một tràn thông thường không ghi đè lên địa chỉ trả về có lẽ sẽ chỉ ghi đè lên các biến cục bộ khác.

+0

Các biến cục bộ không có trong ngăn xếp thường không? – Flexo

1

1. Tràn bộ đệm dựa trên ngăn xếp • Xảy ra khi chương trình ghi vào địa chỉ bộ nhớ trên ngăn cuộc gọi của chương trình bên ngoài cấu trúc dữ liệu dự định - bộ đệm độ dài cố định. • Các đặc điểm của lập trình dựa trên stack 1. "Stack" là một không gian bộ nhớ trong đó các biến tự động được cấp phát. 2. Các thông số chức năng được cấp phát trên ngăn xếp và không được hệ thống tự động khởi tạo, vì vậy chúng có rác cho đến khi chúng được khởi tạo. 3. Khi một hàm đã hoàn thành chu kỳ của nó, tham chiếu đến biến trong ngăn xếp sẽ bị xóa. (tức là nếu hàm được gọi nhiều lần, biến cục bộ và tham số của nó được tạo lại và hủy mỗi lần hàm được gọi và thoát.)
• Kẻ tấn công khai thác tràn bộ đệm dựa trên ngăn xếp để thao tác chương trình theo nhiều cách khác nhau bằng cách ghi đè
1 Một biến cục bộ gần bộ đệm trong bộ nhớ trên ngăn xếp để thay đổi hành vi của chương trình có thể có lợi cho kẻ tấn công.
2. Trả lại địa chỉ trong khung ngăn xếp. Khi hàm trả về, việc thực hiện sẽ tiếp tục tại địa chỉ trả về như được chỉ định bởi kẻ tấn công, thường là một bộ đệm điền đầy người dùng. 3. Một con trỏ hàm, hoặc xử lý ngoại lệ, sau đó được thực hiện. • Các yếu tố để khắc phục các khai thác là
1. Các byte trống trong các địa chỉ 2. Biến đổi vị trí mã shell 3. Sự khác biệt giữa môi trường Mã shell là một đoạn mã nhỏ được sử dụng để khai thác lỗ hổng phần mềm.

2. Heap Buffer Overflow

• Xảy ra trong khu vực dữ liệu heap. • Tràn xảy ra khi một ứng dụng sao chép nhiều dữ liệu hơn vào bộ đệm so với bộ đệm được thiết kế để chứa. • Dễ bị khai thác nếu nó sao chép dữ liệu vào bộ đệm mà trước tiên không xác minh nguồn đó sẽ khớp với đích. • Các đặc điểm của lập trình dựa trên ngăn xếp và dựa trên đống: • “Heap” là “cửa hàng miễn phí” là không gian bộ nhớ, khi các đối tượng động được cấp phát. • Vùng nhớ là vùng bộ nhớ được cấp phát động các hàm mới(), malloc() và calloc(). • Các biến được tạo động (tức là biến được khai báo) được tạo trên heap trước khi thực thi và được lưu trữ trong bộ nhớ cho đến khi vòng đời của đối tượng đã hoàn thành. • Việc khai thác được thực hiện • Bằng cách làm hỏng dữ liệu để ghi đè lên các cấu trúc bên trong như các con trỏ danh sách liên kết. • Chuyển đổi con trỏ để ghi đè chức năng chương trình

Các vấn đề liên quan