4

在 Linux 上,有没有办法判断二进制文件是否已通过命令行打开/关闭堆栈粉碎进行编译?

我很确定我已经开启了保护,但为了理智起见,我想为我的二进制文件编写一些测试,以防有一天一切都出错并且保护关闭......一些原因。

4

1 回答 1

7

如果您的可执行文件格式是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 节)

也可以看看

从已编译的可执行文件中获取编译器选项?

于 2013-06-20T17:37:22.793 回答