gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:43:34 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com