找出是否已使用堆栈粉碎保护编译二进制文件

lda*_*lw1 3 c unix linux command-line binaryfiles

在Linux上,有没有办法告诉我是否已经从命令行打开/关闭堆栈粉碎编译二进制文件?

我很确定我有保护,但仅仅为了理智,我想为我的二进制文件编写一些测试,以防万一有一天出现问题且保护已关闭...某些原因.

Vil*_*ray 7

如果你对你的可执行文件格式为ELF,它碰巧已被编译GCC 4.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
Run Code Online (Sandbox Code Playgroud)

GCC通过-frecord-gcc-switches交换机时,它会将.GCC.comment.line包含传递给GCC的交换机的部分添加到它创建的二进制ELF文件中.

然后,您可以使用readelf从二进制ELF文件中打印出相关部分,并搜索-fno-stack-protector交换机是否存在,以确定二进制文件是否已使用堆栈粉碎打开/关闭进行编译.

不幸的是,这个解决方案仅限于使用-frecord-gcc-switches- 编译的二进制文件- 这实际上意味着它在大多数情况下都是无用的,尽管在您的特定情况下可能会运气不好.


值得一提的是,检测二进制文件中的缓冲区溢出漏洞是一个活跃的研究领域.例如,这是一篇研究论文,详细介绍了一个简单的检测模块(参见第7.1节).

也可以看看

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