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

gpnt7bae  于 2023-10-18  发布在  Unix
关注(0)|答案(2)|浏览(179)

在Linux上,有没有什么方法可以从命令行判断一个二进制文件是否已经通过打开/关闭stack-smashing进行编译?
我很确定我有保护,但只是为了理智起见,我想为我的二进制文件写一些测试,以防有一天一切都出错,保护关闭。因为某种原因

qncylg1j

qncylg1j1#

如果您的可执行文件格式是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开关的存在,以确定二进制文件是否已使用stack-smashing on/off编译。
不幸的是,这种解决方案仅限于使用-frecord-gcc-switches编译的二进制文件--这实际上意味着它对大多数情况都是无用的,尽管您可能在特定的情况下运气好。
值得一提的是,二进制文件中缓冲区溢出漏洞的检测是一个活跃的研究领域。例如,这里有一个research paper detailing a simple detection module (see section 7.1)

参见

Get the compiler options from a compiled executable?

e4yzc0pl

e4yzc0pl2#

checksec命令可用于检查堆栈保护措施(沿着其他二进制安全属性):

checksec --file /usr/bin/ls
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols     FORTIFY Fortified   Fortifiable FILE
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   No Symbols  Yes     5           17          /usr/bin/ls

请注意,STACK CANARY指示是否为可执行文件启用堆栈保护。
这个命令可以通过大多数Linux发行版的包管理器安装;它使用的bash脚本也可以从它的github repo下载。

相关问题