当向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)。
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
2条答案
按热度按时间qncylg1j1#
如果您的可执行文件格式是ELF,并且它 * 碰巧 * 已经由GCC v4.3或更高版本编译,并且 * 碰巧 * 被传递给
-frecord-gcc-switches
命令行开关,那么您可以执行以下操作:当向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?
e4yzc0pl2#
checksec
命令可用于检查堆栈保护措施(沿着其他二进制安全属性):请注意,
STACK CANARY
指示是否为可执行文件启用堆栈保护。这个命令可以通过大多数Linux发行版的包管理器安装;它使用的bash脚本也可以从它的github repo下载。