sprintf
,其中这个sprintf隐式调用了__sprintf_chk()
。这个__sprintf_chk()
似乎通过检查堆栈帧来检查缓冲区溢出。为了我的研究目的,我想知道是否有可能禁用使用
__sprintf_chk()
?sprintf
,其中这个sprintf隐式调用了__sprintf_chk()
。这个__sprintf_chk()
似乎通过检查堆栈帧来检查缓冲区溢出。__sprintf_chk()
?尝试将程序中所有对 sprintf 的调用替换为以下形式:
sprintf(params...);
转化为
(sprintf)(params...);
这将禁用任何基于预处理器的sprintf更改 (*仅当使用类似于__sprintf_chk
的函数宏更改sprintf时)。
对于gcc,有选项-fno-stack-protector -fno-mudflap
。也可以是-D_FORTIFY_SOURCE=0
(适用于任何glibc)
对于Ubuntu和Debian,有安全功能列表页面:http://wiki.debian.org/Hardening和https://wiki.ubuntu.com/Security/Features 此处列出了一些已使用的编译器标志:https://wiki.ubuntu.com/ToolChain/CompilerFlags
还有一篇关于SSP(堆栈保护程序)和Fortify_source(glibc)的论文:http://www.linuxfromscratch.org/hints/downloads/files/ssp.txt
注:同样适用于__fgets_chk __gets_chk __printf_chk __fprintf_chk __vprintf_chk __vfprintf_chk __vsprintf_chk __wmemcpy_chk __wmemmove_chk __wmempcpy_chk __wmemset_chk __wcscpy_chk __wcpcpy_chk __wcsncpy_chk __wcpncpy_chk __wcscat_chk __wcsncat_chk __swprintf_chk __vswprintf_chk __fwprintf_chk __wprintf_chk __vfwprintf_chk __vwprintf_chk __fgetws_chk __wcrtomb_chk __mbsrtowcs_chk __wcsrtombs_chk __mbsnrtowcs_chk __wcsnrtombs_chk __memcpy_chk __memmove_chk __mempcpy_chk __memset_chk __strcpy_chk __strncpy_chk __stpncpy_chk __strcat_chk以及其他一些函数。
-O3
时从来没有起作用过。在这种情况下,唯一起作用的是-D_FORTIFY_SOURCE=0
或-U_FORTIFY_SOURCE
。 - Z boson-Wl,--wrap = sprintf
进行编译,并使用--wrap = sprintf
进行链接。您需要一个单独的代码模块来处理__wrap_sprintf
。然后,您可以在不更改任何代码的情况下使用接受的答案。我个人不喜欢关闭大量代码的警告。另请参见下面的答案。也许有一种方法可以更改构建系统,以便仅针对某些代码模块提供-D_FORTIFY_SOURCE = 0
。 - Daisuke Aramaki__sprintf_chk()似乎通过检查栈帧来检查缓冲区溢出。 ... 出于我的研究目的,我想知道是否有可能禁用使用__sprintf_chk()?
我相信这是来自于FORTIFY_SOURCE
。像这样有很多被守卫的函数。 我相信以下内容适合您:
CFLAGS += -U_FORTIFY_SOURCE
或者,您也可以尝试以下方法:
CFLAGS += -D_FORTIFY_SOURCE=0
相关:如果我在现场遇到禁用 FORTIFY_SOURCE
的软件,那么我会对其进行安全性缺陷报告。虽然可以在调试和测试时禁用它,但在生产软件中不合适。
此外,下面是一份[可能不完整]可以使用 FORTIFY_SOURCE
来保护的函数列表:
__sprintf_chk()
函数,以便链接器不会从库中调用它? - Jamie