根据文档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
我正在使用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会试图加强我的代码吗?
1条答案
按热度按时间zphenhs41#
所有的强化逻辑都在Glibc头文件中实现,它们包含的代码将标准API(如
strcpy
)替换为它们的强化类似物(如__strcpy_chk
):您注解掉了
string.h
,因此无法加强此标头中定义的函数。