D_FORTIFY_SOURCE=1 标志用法不起作用



根据文档 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 %dn",
buffer,sizeof(buffer));
strcpy(buffer,argv[1]);
printf ("Buffer Contains: %s , Size Of Buffer is %dn",
buffer,sizeof(buffer));
}

编译命令:-gcc -D_FORTIFY_SOURCE=1 -g -O2 test.c -o ftest

我正在使用checksec(https://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是否试图强化我的代码?

所有强化逻辑都在 Glibc 标头中实现。大致而言,它们包含用强化类似物(如__strcpy_chk)替换标准API(如strcpy)的代码:

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

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

相关内容

  • 没有找到相关文章

最新更新