GCC 编译参数

编译参数

安全技术 完全开启 部分开启 关闭
Canary -fstack-protector-all -fstack-protecto -fno-stack-protector
NX -z noexecstack -z execstack
PIE -pie -no-pie
RELRO -z now -z lazy -z norelro

关闭所有保护

gcc hello.c -o hello -fno-stack-protector -z execstack -no-pie -z norelro

PIE和ASLR的区别

PIE 是编译时随机化,由编译器完成;ASLR 是加载时随机化,由操作系统完成。ASLR 将程序运行时的堆栈以及共享库的加载地址随机化,而 PIE 在编译时将程序编译为位置无关、即程序运行时各个段加载的虚拟地址在装载时确定。开启 PIE 时,编译生成的是动态库文件(Shared object)文件,而关闭 PIE 后生成可执行文件(Executable)。

在分析一个 PIE 开启的二进制文件时,只需要关闭 ASLR,即可使 PIE 和 ASLR 都失效。
关闭ALSR:

 echo 0 > /proc/sys/kernel/randomize_va_space

部分开启(将 mmap 的基址,stack 和 vdso 页面随机化):

 echo 1 > /proc/sys/kernel/randomize_va_space

完全开启(在部分开启的基础上增加 heap的随机化:

 echo 2 > /proc/sys/kernel/randomize_va_space

你可能感兴趣的:(gcc)