2010-03-03 34 views
6

Chương trình của tôi bị lỗi khi tôi thêm tùy chọn -fstack-check và -fstack-protector. __stack_chk_fail được gọi trong dấu vết ngược lại.Cách kiểm tra gcc -fstack-check chính xác hoạt động như thế nào?

Vậy làm thế nào tôi có thể biết được vấn đề ở đâu? Kiểm tra -fstack thực sự kiểm tra những gì? Thông tin về gcc có vẻ quá lớn để tìm ra câu trả lời.

Trả lời

5

Sau khi kiểm tra các chương trình lắp ráp. Tôi nghĩ rằng -fstack-kiểm tra, sẽ thêm mã viết 0 để bù đắp của con trỏ ngăn xếp, do đó, để kiểm tra nếu chương trình truy cập vào một địa chỉ vi phạm, chương trình đã sụp đổ nếu nó. ví dụ: mov $ 0x0, -0x928 (% esp)

+0

bạn có thể xây dựng với một số ví dụ về mã và đầu ra không? –

+0

Điều này không liên quan đến lỗi của bạn. Xem câu trả lời của tôi bên dưới – rurban

2

"` -fstack-bảo vệ' phát ra thêm mã để kiểm tra các lỗi tràn bộ đệm, chẳng hạn như ngăn xếp tấn công đập. Này được thực hiện bằng cách thêm một biến bảo vệ để chức năng với các đối tượng dễ bị tổn thương. Điều này bao gồm các chức năng mà gọi alloca, và chức năng với bộ đệm lớn hơn 8 byte. các bảo vệ được khởi tạo khi một hàm được nhập vào và sau đó kiểm tra khi thoát chức năng. Nếu một tấm séc bảo vệ thất bại, một thông báo lỗi được in và thoát khỏi chương trình"

GCC Options That Control Optimization

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

Tôi Hy vọng điều này sẽ đưa ra một số đầu mối ..

+0

Đó là một trợ giúp tuyệt vời, cảm ơn bạn. – stcatz

+4

Xin lưu ý rằng '-fstack-protector' và' -fstack-check' là các tùy chọn khác nhau. (đối với các đồng nghiệp) – Offirmo

1

-fstack-check: Nếu hai macro tính năng STACK_CHECK_BUILTINSTACK_CHECK_STATIC_BUILTIN được để ở 0 mặc định, nó chỉ chèn một byte NULL mỗi 4kb (trang) khi chồng tăng lên. Theo mặc định chỉ một, nhưng khi ngăn xếp có thể phát triển nhiều trang, đó là trường hợp nguy hiểm nhất, mỗi 4KB. linux> 2.6 chỉ có một khoảng cách trang nhỏ giữa ngăn xếp và đống, có thể dẫn đến các cuộc tấn công khoảng cách ngăn xếp, được biết đến từ năm 2005. Xem What exception is raised in C by GCC -fstack-check option để lắp ráp. Nó được kích hoạt trong gcc ít nhất kể từ 2.95.3, trong tiếng kêu kể từ 3.6.

__stack_chk_fail là mã được chèn vào -fstack-protector xác minh giá trị canary ngăn xếp được chèn vào có thể bị ghi đè bởi luồng tràn ngăn xếp đơn giản, ví dụ: bằng cách đệ quy.

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