7

このsprintfsprintfが暗黙的に呼び出す__sprintf_chk(). これ__sprintf_chk()は、スタック フレームを調べてバッファ オーバーフローをチェックしているようです。

私の研究目的のために、使用を無効にすることは可能__sprintf_chk()でしょうか?

4

2 に答える 2

17

これから、プログラム内のsprintfへのすべての呼び出しを置き換えてみてください。

 sprintf(params...);

の中へ

 (sprintf)(params...);

これにより、プリプロセッサベースのsprintfの変更が無効になります(* sprintfがの場合のように関数のようなマクロを使用して変更された場合のみ__sprintf_chk)。

gccにはオプションがあります-fno-stack-protector -fno-mudflap。(すべてのglibc-D_FORTIFY_SOURCE=0の場合)

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:

  • memcpy
  • mempcpy
  • メモリ移動
  • メムセット
  • stpcpy
  • strcpy
  • strncpy
  • strcat
  • strncat
  • スプリント
  • snprintf
  • vsprintf
  • vsnprintf
  • 取得

gcc -D_FORTIFY_SOURCE=1 と -D_FORTIFY_SOURCE=2 の違いを参照してください。

于 2014-09-12T09:23:49.233 に答える