gcc D_FORTIFY_SOURCE=1标志使用未生效

kyks70gy  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(173)

根据文档https://www.redhat.com/en/blog/enhance-application-security-fortifysource,我看到D_FORTIFY_SOURCE为以下函数提供了缓冲区溢出检查:memcpy,mempcpy,memmove,strcpy,memset...等等我下面的源代码有函数strcpy的用法,我试着用-D_FORTIFY_SOURCE=1编译我的代码,它在编译中没有影响。
测试c:-

// fortify_test.c
#include<stdio.h>

/* Commenting out or not using the string.h header will cause this
 * program to use the unprotected strcpy function.
 */
//#include<string.h>

int main(int argc, char **argv) {
char buffer[5];
printf ("Buffer Contains: %s , Size Of Buffer is %d\n",
                               buffer,sizeof(buffer));
strcpy(buffer,argv[1]);
printf ("Buffer Contains: %s , Size Of Buffer is %d\n",
                               buffer,sizeof(buffer));
}

编译命令:-gcc -D_FORTIFY_SOURCE=1 -g -O2 test.c -o ftest
我正在使用checksechttps://github.com/slimm609/checksec.sh/blob/master/checksec)工具验证我创建的二进制文件,如下所示:

./checksec --file=test
    RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable     FILE
    Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   72) Symbols       No    0               2               test

我在这里遗漏了什么吗?D_FORTIFY_SOURCE=1标志什么时候生效?假设我的源代码文件没有任何函数(memcpy, mempcpy, memmove, memset, strcpy ...etc)用法,并试图用D_FORTIFY_SOURCE=1编译代码,gcc会试图加强我的代码吗?

zphenhs4

zphenhs41#

所有的强化逻辑都在Glibc头文件中实现,它们包含的代码将标准API(如strcpy)替换为它们的强化类似物(如__strcpy_chk):

$ cat /usr/include/string.h
...
#ifdef _FORTIFY_SOURCE
#define strcpy __strcpy_chk
#endif
...

您注解掉了string.h,因此无法加强此标头中定义的函数。

相关问题