开关程序保护措施的 gcc 编译选项

开启/关闭栈不可执行 (NX)

开启 NX(默认)。

-z noexecstack

关闭 NX。

-z execstack

开启/关闭 canary

为所有函数开启 canary 保护。

-fstack-protector-all

为含有 char 数组局部变量的函数开启 canary 保护(默认)。

-fstack-protector

关闭 canary。

-fno-stack-protector

开启/关闭 PIE

开启 PIE。

-fpie -pie

关闭 PIE(默认)。

-no-pie

RELRO

RELRO 全名为 RELocation Read Only,它的作用是将二进制文件的某些段设置为只读。

RELRO 共有三种保护模式,分別为 No / Partial / Full。

  • No RELRO,即 Link Map、GOT 均可写。
  • Partial RELRO,即 Link Map 不可写,GOT 可写。
  • Full RELRO,即 Link Map、GOT 均不可写。

开启/关闭 RELRO

开启 Partial RELRO(默认)。

-z lazy

开启 Full RELRO。

-z now

开启 No RELRO。

-z norelro

参考资料

2019-2020 @lukbash