用 GCC 编译一个完全不安全的二进制文件
作为安全研究人员,有时需要编译一些完全不安全的二进制文件用来研究缓冲区溢出等漏洞。最新的 GCC 在编译是会默认加上许多安全功能来防止安全漏洞的出现,而为了触发漏洞我们必须关闭这些安全功能。这篇文章将讲述如何编译并运行不安全的 GCC 编译二进制。

作为安全研究人员,有时需要编译一些完全不安全的二进制文件用来研究缓冲区溢出等漏洞。最新的 GCC 在编译是会默认加上许多安全功能来防止安全漏洞的出现,而为了触发漏洞我们必须关闭这些安全功能。这篇文章将讲述如何编译并运行不安全的 GCC 编译二进制。

GCC 编译开关

GCC 关闭所有安全功能的完整命令如下:

1
gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack
  • -m32: cross compile 成 x86 32 位二进制(可选)
  • -g:启用调试功能(可选)
  • -mpreferred-stack-boundary=2:将内存对齐到 4-byte
  • -no-pie:禁用 PIE(地址无关可执行文件)
  • -fno-stack-protector:移除堆栈保护措施
  • -Wl,-z,norelro:禁用 RELRO(read only relocation)
  • -z execstack:禁用 NX,使堆栈空间内容可执行

此命令参考了 https://security.stackexchange.com/a/216710 中使用的命令。

编译完成之后可以用 Trapkit 提供的 checksec.sh 小工具来校验各安全功能的开关情况。

禁用 Linux ASLR

要使二进制的执行环境完全不受保护,还需要关闭 ASLR(位置空间布局随机化)。使用以下命令关闭 ASLR。注意,使用此命令将会关闭全局 ASLR 并使系统不安全,建议在 VM 中使用此命令。

1
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

最后修改于 2020-01-01