c - 查明二进制文件是否已使用堆栈粉碎保护进行编译

标签 c linux unix command-line binaryfiles

在 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 文件。

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

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


值得一提的是,检测二进制文件中的缓冲区溢出漏洞是一个活跃的研究领域。例如,这是一个 research paper detailing a simple detection module (see section 7.1) .

另见

Get the compiler options from a compiled executable?

关于c - 查明二进制文件是否已使用堆栈粉碎保护进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17219252/

相关文章:

c++ - 在 C/C++ 中实现通信协议(protocol)

c - libpcap 源地址和目标地址在捕获的 ipheader 中始终为 NULL。

unix - Unix 中定义的 FILE 在哪里

linux - Grep 问题 : Why is grep -i not grabbing the instance with special characters

c - 如何制作下载其较新副本的二进制文件?(有限条件)

c - c中的整数大小取决于什么?

c - AIX 中 strrspn 和 strfind 函数(Solaris 中的 libgen 函数)的替代方案?

c - DisjointSet 的问题

c - 迭代时内核哈希表崩溃

linux - 如何使用 apt-get 删除不完整的包?