2012-05-23 23 views
14

Tôi đã viết một ứng dụng trong C và tôi đang cố gắng hiểu mục đích của lệnh -fno-stack-protector khi biên dịch là gì. Đối với ứng dụng cụ thể của tôi, nó làm cho không có sự khác biệt nếu tôi sử dụng lệnh này hay không trong điều khoản của bảo vệ chống lại tràn bộ đệm.Việc sử dụng -fno-stack-protector là gì?

Tôi đã đọc trực tuyến các lệnh bảo vệ -fstack và -fno-stack-protector bật và tắt tương ứng trình bảo vệ ngăn xếp ngăn xếp, nhưng nếu tôi tự biên dịch ứng dụng, thì trình bảo vệ có thể được kích hoạt trước ? Việc sử dụng lệnh có thể phụ thuộc vào hệ thống đang chạy ứng dụng nào không?

Cảm ơn

Trả lời

8

Trong GCC tiêu chuẩn/cổ phiếu, chồng bảo vệ được tắt theo mặc định. Tuy nhiên, một số bản phân phối Linux đã vá GCC để bật nó theo mặc định. Theo tôi, điều này khá có hại, vì nó phá vỡ khả năng biên dịch bất cứ thứ gì không được liên kết với các thư viện không gian người dùng chuẩn trừ khi Makefile cụ thể vô hiệu hóa ngăn xếp ngăn xếp. Nó thậm chí sẽ phá vỡ việc xây dựng hạt nhân Linux ngoại trừ việc các bản phân phối với hack này bổ sung thêm hacks để GCC để phát hiện rằng hạt nhân đang được xây dựng và vô hiệu hóa nó.

+2

Theo mặc định, mọi thứ được biên dịch trên hệ thống có ngăn xếp ngăn xếp sẽ được liên kết với thư viện được tạo bằng ngăn xếp ngăn xếp. sẽ được biên soạn trên một hệ thống có bảo vệ ngăn xếp được bật không? – tbert

+1

Tôi giả sử bạn đang đối phó với phần thứ hai của câu trả lời của tôi (các ý kiến ​​về lý do tại sao nó có vấn đề) và nếu như vậy, trong trường hợp đó câu trả lời là không. Bất kỳ mã nào không có ý định chạy như là một phần của hệ sinh thái không gian người dùng của máy chủ sẽ không được liên kết với bất kỳ thư viện nào của máy chủ. (Ví dụ, một hạt nhân không được liên kết với bất kỳ thư viện không gian người dùng nào. Ví dụ khác sẽ là mã bộ nạp khởi động, các mô-đun được đọc và sử dụng như các khuôn mẫu của trình giả lập dynrec/JIT, v.v.) –

+0

Không nói về không gian hạt nhân, nhưng không gian người dùng; Biên dịch JIT không được thực hiện với trình biên dịch C; Vì vậy, tôi phải hỏi, vấn đề với việc bật bảo vệ ngăn xếp trong userland là gì, ngoài việc có thể phải đặt "-fno-stack-protector" trong biên dịch args cho hạt nhân Linux? – tbert

10

Nếu bạn biên dịch với -fstack-protector, thì sẽ có thêm một chút không gian được phân bổ trên ngăn xếp và một chút chi phí trên đầu vào và trả về từ một hàm trong khi mã thiết lập séc và sau đó thực sự kiểm tra xem bạn đã ghi chồng lên trong khi đang ở trong hàm.

Nó sẽ tạo sự khác biệt cho đơn đăng ký của bạn. Nếu được kích hoạt, nó sẽ nhanh chóng thoát khỏi các cuộc tấn công tràn ngăn xếp. Chỉ khi bạn không có các cuộc gọi hàm trong mã của bạn thì nó sẽ không để chương trình của bạn không bị ảnh hưởng (và vì bạn thường viết main(), và đó là một hàm được gọi bởi mã khởi động, nó sẽ có ảnh hưởng đến chương trình của bạn). Tuy nhiên, các cuộc tấn công tràn ngăn xếp không phải là các cuộc tấn công duy nhất có thể được sử dụng, vì vậy nó không phải là thuốc chữa bách bệnh. Nhưng nó là bảo vệ hữu ích với chi phí giới hạn.

Việc bảo vệ không phụ thuộc vào hệ thống; nó phụ thuộc vào phiên bản của trình biên dịch mà bạn đang sử dụng, nhưng đó là tất cả.

+0

'-fstack-protector' cũng sắp xếp lại bố cục ngăn xếp để dễ phát hiện ra dấu gạch ngang. – jww

0

Trình bảo vệ ngăn xếp là mã được tạo bởi trình biên dịch và được đặt vào chương trình của bạn. Nó không phải là một chương trình bên ngoài hoặc gọi hệ thống được gọi bởi chương trình của bạn.

1

Times khi một lựa chọn phù hợp với một môi trường biên dịch mặc định có thể hữu ích bao gồm:

  • khi bạn đang sử dụng một hệ thống xây dựng có thể có một cấu hình phức tạp mà bạn muốn tinh chỉnh. Thay vì tìm ra nơi trong một mê cung của makefiles nó có thể được lựa chọn để sử dụng fstack-protector (ví dụ), nó có thể cho phép bạn dễ dàng vượt qua trong các tùy chọn bổ sung mà chỉ đơn giản là nhận được tacked vào cuối danh sách các tùy chọn. Nếu GCC thấy cả hai fstack-protectorfno-stack-protector trong tập hợp các tùy chọn, lệnh cuối cùng trên dòng lệnh là lệnh có hiệu lực.

  • lần khác loại điều này có thể hữu ích (dường như không áp dụng cho -fstack-protector, tuy nhiên) là khi bạn có tùy chọn bật một loạt 'tùy chọn phụ'. Ví dụ: thiết lập -O2 bật một loạt các tùy chọn tối ưu hóa -fxxx và bạn có thể muốn sử dụng -O2 cho hầu hết các phần nhưng không muốn tối ưu hóa bí danh nghiêm ngặt của GCC. Vì vậy, bạn có thể chỉ định -fno-strict-aliasing để đặt tùy chọn cụ thể đó trở lại cài đặt mặc định của nó.(Lưu ý: trường hợp này thực sự tương đương với trường hợp trên)

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