Отключить использование __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.