在 Linux 上,有没有办法判断二进制文件是否已通过命令行打开/关闭堆栈粉碎进行编译?
我很确定我已经开启了保护,但为了理智起见,我想为我的二进制文件编写一些测试,以防有一天一切都出错并且保护关闭......一些原因。
在 Linux 上,有没有办法判断二进制文件是否已通过命令行打开/关闭堆栈粉碎进行编译?
我很确定我已经开启了保护,但为了理智起见,我想为我的二进制文件编写一些测试,以防有一天一切都出错并且保护关闭......一些原因。
如果您的可执行文件格式是ELF,并且它恰好是由GCC v4.3或更高版本编译的,恰好通过了-frecord-gcc-switches
命令行开关,那么您可以执行以下操作:
$ gcc -frecord-gcc-switches -fno-stack-protector test.c
$ readelf -p .GCC.command.line a.out
String dump of section '.GCC.command.line':
[ 0] -imultiarch x86_64-linux-gnu
[ 1d] test.c
[ 24] -mtune=generic
[ 33] -march=x86-64
[ 41] -frecord-gcc-switches
[ 57] -fno-stack-protector
当GCC通过-frecord-gcc-switches
开关时,它会将.GCC.comment.line
包含传递给GCC的开关的部分添加到它创建的二进制ELF文件中。
然后,您可以使用从二进制ELFreadelf
文件中打印出相关部分并搜索是否存在该开关,以确定二进制文件是否已在打开/关闭堆栈粉碎的情况下进行编译。-fno-stack-protector
不幸的是,这个解决方案仅限于使用-frecord-gcc-switches
-- 编译的二进制文件,这实际上意味着它在大多数情况下是无用的,尽管在特定情况下你可能会走运。
值得一提的是,检测二进制文件中的缓冲区溢出漏洞是一个活跃的研究领域。例如,这里有一篇研究论文详细介绍了一个简单的检测模块(参见第 7.1 节)。