警戒バッファオーバーフロー(Cの不安全なライブラリ関数)
CとC++は境界検査を自動的に行うことができず,境界検査の代価は効率である.一般的に、Cは多くの場合効率を重視している.しかしながら、効率を得る代価として、Cプログラマーはバッファオーバーフローの問題を回避するために十分に警戒しなければならない.
C言語標準ライブラリの多くの文字列処理とIOストリーム読み出し関数は、バッファオーバーフローの原因となります.これらの関数を理解し、プログラミングに注意する必要があります.
一、文字列処理関数 strcpy() strcat() sprintf()、vsprintf()
二、文字読取関数 gets() getchar()、fgetc()、getc()、read() scanf()シリーズsscanf()、fscanf()、vfscanf()、vscanf()、vscanf()、vscanf() getenv()
三、安全バージョンのコードライブラリを使用する
マイクロソフトは、バッファオーバーフローの危険があるAPIに対して、開発したセキュリティバージョンのライブラリを使用して代替します.SafeCRTはVisual Studio 2005よりサポートを開始しています.コードに無効な危険なCRT関数が使用されている場合、Visual Studio 2005がコンパイルされると、開発者にSafe CRTに代わるより安全であることを考慮するように警告情報が報告されます.文字列コピーに関するAPI:strcpy、wcscpyなどの代替Safe CRT関数:strcpy_s 文字列結合に関するAPI、例えばstrcat、wcscatなどの代替Safe CRT関数:strcat_s sprintfに関するAPI例えばsprintf,swprintfなどの代替Safe CRT関数:snprintf_s _snwprintf_s
他にも無効なAPIにはscanf,strtok,gets,itoaなどがあります.」n」シリーズの文字列処理関数、例えばstrncpyなども無効になっている列です.
くりを一つあげる
次のパスワード保護コードを解読します.
コマンドラインに入力した文字をパスワードとすると、まず11文字を入力し、最後の文字が0より大きいと、strcpyは'/0'までcopyになります.彼はずっとこの11文字をpasswd配列にcopyして、この时配列は境界を越えて、最后の文字はflagフラグビットを割り当てて、if条件は満たして、パスワードは解読されました!上記の議論を経て,固定された空間を事前に割り当てるのではなく,ユーザに同じサイズの空間を動的に割り当てることができる.passwd = (char *)malloc(strlen(argv[1])); strcpy(passwd, argv[1]); 注意:strncpy()を使用しないでください.最後のビットが失われ、隠されたエラーが発生します.
四、バッファオーバーフロー問題について
関数呼び出しスタックヘッダは、呼び出しスタックのベースアドレス%ebpを保存するため、格納%ebpの値を破壊すると、ベースアドレスレジスタが正しく復元されないため、呼び出し元はローカル変数またはパラメータを正しく参照できません.格納された戻りアドレスが破壊されるとret命令はプログラムを全く予想外の場所にジャンプさせる.
バッファオーバーフローのより致命的な使用は、プログラムが実行したくない関数を実行させることです.これは、コンピュータネットワークを介してシステムのセキュリティを攻撃する最も一般的な方法です.通常、プログラムに入力される文字列です.この文字列には、攻撃コードと呼ばれる実行可能なコードのバイト符号化が含まれています.また、攻撃コードを指すポインタで戻りアドレスを上書きするバイトもあります.ではret命令を実行する効果は攻撃コードにジャンプすることです.バッファオーバーフローに対抗する攻撃スタックランダム化 を制限する.
バッファオーバーフローについては、このブログを参照してください.http://blog.csdn.net/yang_yulei/article/details/21407461
[参照リンク]http://www.360doc.com/content/11/0610/16/6295074_126040631.shtml
C言語標準ライブラリの多くの文字列処理とIOストリーム読み出し関数は、バッファオーバーフローの原因となります.これらの関数を理解し、プログラミングに注意する必要があります.
一、文字列処理関数
strcpy() 。 ! , , !
strncpy :
strncpy(dst, src, dst_size-1);
src dst , ; , 。 strncpy() -1。 src dst , , dst 。
! strncpy() , 。 “ ” , 。
strcpy() , , strlen() 。
dst = (char *)malloc(strlen(src));
strcpy(dst, src);
strcat() strcpy(), 。 、 strncat()。 , strncat() strcat()。
sprintf() vsprintf() 。 strcpy() 。 , sprintf() vsprintf() strcpy() , 。
sprintf() 。 。sprintf ”*” , 。
:
sprintf(usage, "USAGE: %*s
", BUF_SIZE, argv[0]);
二、文字読取関数
gets()。 , EOF , 。 :gets() 。 , gets() 。
, fgets()。 gets() , , , 。
,
scanf 。 。
, 。
getenv() 。
三、安全バージョンのコードライブラリを使用する
マイクロソフトは、バッファオーバーフローの危険があるAPIに対して、開発したセキュリティバージョンのライブラリを使用して代替します.SafeCRTはVisual Studio 2005よりサポートを開始しています.コードに無効な危険なCRT関数が使用されている場合、Visual Studio 2005がコンパイルされると、開発者にSafe CRTに代わるより安全であることを考慮するように警告情報が報告されます.
他にも無効なAPIにはscanf,strtok,gets,itoaなどがあります.」n」シリーズの文字列処理関数、例えばstrncpyなども無効になっている列です.
くりを一つあげる
次のパスワード保護コードを解読します.
#include
int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}
if(flag)
{
printf("
Password cracked
");
}
else
{
printf("
Incorrect passwd
");
}
return 0;
}
コマンドラインに入力した文字をパスワードとすると、まず11文字を入力し、最後の文字が0より大きいと、strcpyは'/0'までcopyになります.彼はずっとこの11文字をpasswd配列にcopyして、この时配列は境界を越えて、最后の文字はflagフラグビットを割り当てて、if条件は満たして、パスワードは解読されました!上記の議論を経て,固定された空間を事前に割り当てるのではなく,ユーザに同じサイズの空間を動的に割り当てることができる.passwd = (char *)malloc(strlen(argv[1])); strcpy(passwd, argv[1]); 注意:strncpy()を使用しないでください.最後のビットが失われ、隠されたエラーが発生します.
四、バッファオーバーフロー問題について
関数呼び出しスタックヘッダは、呼び出しスタックのベースアドレス%ebpを保存するため、格納%ebpの値を破壊すると、ベースアドレスレジスタが正しく復元されないため、呼び出し元はローカル変数またはパラメータを正しく参照できません.格納された戻りアドレスが破壊されるとret命令はプログラムを全く予想外の場所にジャンプさせる.
バッファオーバーフローのより致命的な使用は、プログラムが実行したくない関数を実行させることです.これは、コンピュータネットワークを介してシステムのセキュリティを攻撃する最も一般的な方法です.通常、プログラムに入力される文字列です.この文字列には、攻撃コードと呼ばれる実行可能なコードのバイト符号化が含まれています.また、攻撃コードを指すポインタで戻りアドレスを上書きするバイトもあります.ではret命令を実行する効果は攻撃コードにジャンプすることです.
, , , 。 。 , , , 。
。 , 。 。
: , 0--n 。 , 。
Linux , 。( linux , )
スタック破壊検出 C , , , , , 。
GCC , , 。 , , 。
, 。 , 。
実行可能コード領域 。 , , 。
64 ”NX”( ) 。 , , , , 。
バッファオーバーフローについては、このブログを参照してください.http://blog.csdn.net/yang_yulei/article/details/21407461
[参照リンク]http://www.360doc.com/content/11/0610/16/6295074_126040631.shtml