我观察到一个 c++ 程序使用sprintf
sprintf 隐式调用__sprintf_chk()
. 这__sprintf_chk()
似乎通过检查堆栈帧来检查缓冲区溢出。
出于我的研究目的,我想知道是否可以禁用 using __sprintf_chk()
?
我观察到一个 c++ 程序使用sprintf
sprintf 隐式调用__sprintf_chk()
. 这__sprintf_chk()
似乎通过检查堆栈帧来检查缓冲区溢出。
出于我的研究目的,我想知道是否可以禁用 using __sprintf_chk()
?
尝试从此替换程序中对 sprintf 的所有调用:
sprintf(params...);
进入
(sprintf)(params...);
这将禁用任何基于预处理器的 sprintf 更改(* 仅当使用类似函数的宏更改 sprintf 时,例如 的情况__sprintf_chk
)。
对于 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 (stack-protector) 和 Fortify_source (glibc) 的论文: http ://www.linuxfromscratch.org/hints/downloads/files/ssp.txt
PS:同为__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和其他一些
这个 __sprintf_chk() 似乎通过检查堆栈帧来检查缓冲区溢出。...出于我的研究目的,我想知道是否可以使用 __sprintf_chk() 禁用?
我相信那是从FORTIFY_SOURCE
. 有很多这样的保护功能。我相信以下内容对您有用:
CFLAGS += -U_FORTIFY_SOURCE
或者,您可以:
CFLAGS += -D_FORTIFY_SOURCE=0
相关:如果我在该领域遇到禁用 的软件FORTIFY_SOURCE
,那么我会针对它提出安全缺陷。可以为调试和测试禁用 ot,但不适用于生产软件。
相关的,这里有一个[可能不完整的]可以保护的功能列表FORTIFY_SOURCE
: