GCC安全编译参数

这篇具有很好参考价值的文章主要介绍了GCC安全编译参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、写在前面

A main pillar in security is that security is done in layers. During software build, compilation is done using a number of flags and switches that enhance the functionality and security of the output program.
Below is a list of a number of compilation flags that must be enabled during build of all software components, including both proprietary and 3rd party open-source components.

总的来说就是安全是分层的,编译安全也是一个重要的方面,我们要在所有软件以及开源库都使用如下标志来进行构建:-fstack-protector-all、-Wl,relro,Wl,now、-s、-fPIE –pie、-fPIC、-D_FORTIFY_SOURCE=2 -O1,这些编译参数适用于gcc和clang.

-fstack-protector-all:

用于在编译和链接过程中自动添加堆栈保护机制。它的作用是在函数调用时检查堆栈的完整性,以防止缓冲区溢出等常见的安全问题。

具体来说,-fstack-protector-all会在编译时为每个函数添加额外的代码,用于检查函数的返回地址是否被修改,以及在函数调用前后检查函数的堆栈帧是否完整。如果检测到堆栈被破坏,程序将会终止,并输出相关的错误信息。

使用-fstack-protector-all的好处是提高程序的安全性。通过检查堆栈的完整性,可以防止一些常见的攻击手段,如缓冲区溢出和栈溢出攻击。这些攻击手段常被用于执行恶意代码、绕过程序的安全检查以及获取系统权限。使用堆栈保护机制可以大大减少这些攻击的成功率。

需要注意的是,使用-fstack-protector-all会增加程序的运行时开销和内存占用,因为需要额外的代码来检查堆栈的完整性。但是这个开销通常是可以接受的,尤其对于对安全性要求较高的程序而言。

Wl,-z,relro,-z,now是用于向链接器传递选项的编译器参数。具体作用如下:

-Wl: 该选项用于将其后的参数传递给链接器。
-z,relro: 这个选项告诉链接器在运行时将只读段设为“重定位只读”(RelRO),即只读段的重定位信息将在程序加载时完成,并且只读段将被标记为只读,防止攻击者修改这些段的内容。
-z,now: 这个选项告诉链接器在程序加载时立即解析所有符号引用,而不是在第一次使用时再解析。这可以防止动态链接器在程序运行时进行符号解析,减少了攻击者利用延迟绑定漏洞的机会。
这些选项的好处是增强了程序的安全性。通过将只读段设为“重定位只读”,可以防止攻击者通过修改只读段来实施攻击,例如覆盖只读数据或插入恶意代码。而通过立即解析所有符号引用,可以减少动态链接器在运行时的工作量,提高程序的启动速度,并减少了攻击者利用延迟绑定漏洞的机会。

-s:从二进制文件中去掉符号表

-fPIE -pie:构建为与位置无关的代码,以在编译的软件二进制文件上启用 ASLR 随机化

-fPIC:构建与位置无关的代码以在编译的软件库上启用 ASLR 随机化。

-D_FORTIFY_SOURCE=2:启用FORTIFY_SOURCE特性的级别2,用于提供更强的安全性

-O1:启用优化级别1,该级别会进行一些基本的优化,但不会对代码进行过度优化

注意:部分编译器可能没有提供-fstack-protector-all编译选项,至少对我测试的编译器来说,这是可以使用-Wa,–noexecstack来尽可能地保证安全。

-Wa,–noexecstack: 禁止生成可执行文件时使用可执行栈

-Wa,–noexecstack是用于向汇编器传递选项的编译器参数。具体作用如下:

  • -Wa: 该选项用于将其后的参数传递给汇编器。
  • –noexecstack: 这个选项告诉汇编器生成的可执行文件不允许在堆栈上执行代码。它将禁用堆栈上的可执行代码段,防止攻击者利用堆栈溢出漏洞在堆栈上注入和执行恶意代码。

使用–noexecstack的好处是提高程序的安全性。通过禁止在堆栈上执行代码,可以防止攻击者利用堆栈溢出漏洞注入和执行恶意代码。堆栈溢出是一种常见的安全漏洞,攻击者可以利用它来执行任意代码,绕过程序的安全机制,并获取系统权限。

需要注意的是,使用–noexecstack可能会影响某些特定的程序功能,因为有些程序可能需要在堆栈上执行代码。在这种情况下,可以根据具体需求来决定是否使用–noexecstack选项。

二、位置无关代码编译验证
结论一:gcc编译器默认开启pie

$ g++ -c pic.cpp
$ ar rcs libPic.a pic.o
$ g++ -c -I./ pie.cpp
$ g++  pie.o libPic.a -o test.exe
$ ./checksec.sh  --file test.exe
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Full RELRO      No canary found   NX enabled    PIE enabled     No RPATH   No RUNPATH   test.exe

结论二:我们使用的交叉编译器默认关闭pie,编译时全部文件加上-fPIC最终才能使用-pie生成位置无关程序

$ arm-ca9-linux-uclibcgnueabihf-g++ -c -fPIC pic.cpp
$ arm-ca9-linux-uclibcgnueabihf-ar rcs libPic.a pic.o
$ arm-ca9-linux-uclibcgnueabihf-g++ -c -fPIC -fPIE -I./ pie.cpp
$ arm-ca9-linux-uclibcgnueabihf-g++  pie.o libPic.a -pie -o test.exe
$ ./checksec.sh  --file test.exe
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Partial RELRO   No canary found   NX disabled   PIE enabled     No RPATH   No RUNPATH   test.exe

结论三:如果存在未使用-PIC编译参数的库,最终无法使用-pie生成目标程序文章来源地址https://www.toymoban.com/news/detail-775936.html

$ arm-ca9-linux-uclibcgnueabihf-g++ -c pic.cpp
$ arm-ca9-linux-uclibcgnueabihf-ar rcs libPic.a pic.o
$ arm-ca9-linux-uclibcgnueabihf-g++ -c -fPIC -fPIE -I./ pie.cpp
$ arm-ca9-linux-uclibcgnueabihf-g++  pie.o libPic.a -pie -o test.exe
arm-ca9-linux-uclibcgnueabihf/bin/ld: libPic.a(pic.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
arm-ca9-linux-uclibcgnueabihf/bin/ld: libPic.a(pic.o)(.text+0x10): unresolvable R_ARM_MOVW_ABS_NC relocation against symbol `_ZSt4cout@@GLIBCXX_3.4'
arm-ca9-linux-uclibcgnueabihf/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
arm-ca9-linux-uclibcgnueabihf-g++ -c pic.cpp
arm-ca9-linux-uclibcgnueabihf-ar rcs libPic.a pic.o
arm-ca9-linux-uclibcgnueabihf-g++ -c -I./ pie.cpp
arm-ca9-linux-uclibcgnueabihf-g++  pie.o libPic.a -znoexecstack -o test.exe
readelf -l test.exe | grep GNU_STACK

到了这里,关于GCC安全编译参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 嵌入式 编译系列 2.6 -- GCC 编译时间统计参数 -ftime-report -Q 】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 如果你想要统计 GCC 编译过程中各个阶段的时间,可以使用 GCC 的 -ftime-report 选项。这个选项可以让编译器在编译结束后报告每个编译阶段所花费的时间。要使用这个选项,你可以在编译命令中加入它,如下所示: 这将

    2024年01月21日
    浏览(54)
  • 【ARM 嵌入式 编译系列 2.2 -- GCC 编译参数学习 assembler-with-cpp 使用介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 在 rt-thread 的编译脚本中经常会看到下面编译参数: arm-none-eabi-gcc 是针对 ARM 架构的交叉编译器,用于编译嵌入式 ARM 应用程序。在 GCC 中, -x 选项用于指定要编译的输入文件的语言。当与 assembler-with-cpp 一起使用时,

    2024年01月23日
    浏览(44)
  • 【ARM 嵌入式 编译系列 2.3 -- GCC 编译参数学习 -Wa,-mimplicit-it=thumb 使用介绍】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 在移植 RT-Thread 时,使用Make 进行编译,结果遇到了下面问题: rtt_os/cortex-m33/context_gcc.S: Assembler messages: rtt_os/cortex-m33/context_gcc.S:154: Error: thumb conditional instruction should be in IT block – vstmdbeq r1!,{d8-d15}\\\' rtt_os/cortex-m33/context_

    2024年01月20日
    浏览(55)
  • 【C语言_Error】GCC编译错误

    GCC (GNU Compiler Collection) is a free and open-source compiler system developed by the GNU Project that supports various programming languages such as C, C++, Objective-C, Fortran, Ada, and others. It is widely used in the development of software for Linux, Unix, MacOS, and other operating systems. GCC is known for its optimization capabilities and is the

    2024年02月09日
    浏览(36)
  • Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序

    目录 一. 在Ubuntu系统下用c语言编写一个简单的输出hello world 的程序,并编译、运行。 1.1 gcc/g++简介 1.2 c++程序输出 Hello World: 1.3 c语言程序输出 Hello World: 二. 编写一个主程序文件main1.c和一个子程序文件sub1.c,实现函数间的调用 2.1  编写sub1.c 和main1.c 函数 2.1.1 编写sub1.c函数

    2024年02月04日
    浏览(48)
  • 1762_gcc编译c语言makefile自动生成工具的Perl实现

    全部学习汇总: GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and let\\\'s find an common way so we may don\\\'t need to touch makefile code any more! (github.com)          前阵子实现了一个CodeWarrior嵌入式开发环境的自动编译环境,用的基本上是Python。说起来,我觉得那个环

    2024年02月12日
    浏览(75)
  • Linux GCC常用命令以及GCC编译器

    GCC 是编译工具,它的意思是 GNU C Compiler 。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等。而 GCC 也不再单只是 GNU C 语言编译器的意

    2024年02月05日
    浏览(43)
  • GCC编译过程:预处理->编译->汇编->链接

    目录 引言  概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 当使用集成开发环境(IDE)进行C语言编程时,点击\\\" 编译 \\\"按钮后,整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C语言的编译过程,将源代码转换为最终的可执行文件。虽

    2024年02月13日
    浏览(43)
  • arm gcc编译选项

    arm:架构是arm none:不是特定的供应商提供的 eabi:eabi:嵌入式应用二进制接口(Embedded Application Binary Interface) 因为名称里没有“linux”类似的字样,说明不支持操作系统。 libc 是ANSI C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其

    2024年02月03日
    浏览(38)
  • gcc编译

    GCC(GNU Compiler Collection)是 GNU 工具链 的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC 不仅可以编译 C、C++ 和 Objective-C,还可以通过不同

    2024年02月06日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包