Отключить использование __sprintf_chk()

Я наблюдаю, что программа на C++ использует sprintfгде этот sprintf неявно вызывает __sprintf_chk(), это __sprintf_chk() кажется, проверяет переполнение буфера, исследуя кадры стека.

Интересно, можно ли отключить __sprintf_chk()?

2 ответа

Решение

Попробуйте заменить все вызовы sprintf в вашей программе следующим образом:

 sprintf(params...);

в

 (sprintf)(params...);

Это отключит любые sprintf-change, основанные на препроцессоре (* только если sprintf был изменен с использованием функционально-подобного макроса, как в случае с __sprintf_chk).

Для gcc есть варианты -fno-stack-protector -fno-mudflap, Может быть также -D_FORTIFY_SOURCE=0 (для любого бойца)

Для 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

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:

  • тетсру
  • mempcpy
  • memmove
  • MemSet
  • stpcpy
  • зЬгсру
  • strncpy
  • strcat
  • strncat
  • Sprintf
  • snprintf
  • vsprintf
  • vsnprintf
  • получает

См. Разница между gcc -D_FORTIFY_SOURCE=1 и -D_FORTIFY_SOURCE = 2.

Другие вопросы по тегам