7

我观察到一个 c++ 程序使用sprintfsprintf 隐式调用__sprintf_chk(). 这__sprintf_chk()似乎通过检查堆栈帧来检查缓冲区溢出。

出于我的研究目的,我想知道是否可以禁用 using __sprintf_chk()

4

2 回答 2

17

尝试从此替换程序中对 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和其他一些

于 2012-08-30T18:38:58.243 回答
5

这个 __sprintf_chk() 似乎通过检查堆栈帧来检查缓冲区溢出。...出于我的研究目的,我想知道是否可以使用 __sprintf_chk() 禁用?

我相信那是从FORTIFY_SOURCE. 有很多这样的保护功能。我相信以下内容对您有用:

CFLAGS += -U_FORTIFY_SOURCE

或者,您可以:

CFLAGS += -D_FORTIFY_SOURCE=0

相关:如果我在该领域遇到禁用 的软件FORTIFY_SOURCE,那么我会针对它提出安全缺陷。可以为调试和测试禁用 ot,但不适用于生产软件。


相关的,这里有一个[可能不完整的]可以保护的功能列表FORTIFY_SOURCE

  • 内存
  • 内存
  • 记忆移动
  • 内存集
  • stpcpy
  • 字符串
  • 字符串
  • strcat
  • 字符串猫
  • 冲刺
  • snprintf
  • vsprintf
  • vsnprintf
  • 得到

请参阅gcc -D_FORTIFY_SOURCE=1 和 -D_FORTIFY_SOURCE=2 之间的区别

于 2014-09-12T09:23:49.233 回答