#include <stdio.h>
#include <stdlib.h>
int main(int argc, int *argv[])
{
size_t *p = (size_t *) strtol(argv[1], NULL, 16);
p[0] = 0xDEADBEEF;
printf("RELRO: %p\n", p);
return 0;
}
在编译上面带参数的代码时
$ gcc -g -Wl,-z,relro -o test test.c
并在生成的二进制文件上运行 checksec
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 69 Symbols No 0 1 test
使用以下命令运行
$ gcc -g -Wl,-z,relro,-z,now -o test test.c
并在生成的二进制文件上运行 checksec
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Full RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH 71 Symbols No 0 1 test-full
在使用命令编译
$ gcc -o test test.c
并在生成的二进制文件上运行检查时
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Full RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH 66 Symbols No 0 1 test
我的疑问是如何在没有 relro 的情况下编译二进制文件?以及为什么在我们不提供任何标志时启用 full-relro ?