C rule

) 危険なコーディング

1                char cStr[256];

2                ZeroMemory(cStr, sizeof(cStr));

3                strcpy(cStr, src);    srcのサイズが256バイトを超えていた場合オーバーフロー!

 

修正)

1                char cStr[256];

2                ZeroMemory(cStr,0, sizeof(cStr));

3                strncpy(cStr, src, sizeof(cStr)-1); 

 

危険な関数

代替関数

gets

fgets

strcat

strncat

strcpy

strncpy

sprintf

snprintf

vsprintf

vsnprintf

 

危険な例)

#include <stdlib.h>

main (int argc, char* argv[]) {

printf(argv[1]);

}

 

修正例)

#include <stdlib.h>

main (int argc, char* argv[]) {

  printf("%s",argv[1]);

}

 

危険な関数

printf

sprintf

fprintf

vsprintf

snprintf

vsnprintf

 

 

※書式文字列の脆弱性

書式文字列(フォーマットストリング)とは、printf関数等で使用される書式を指定する文字列

のことである。リストの例では、入力された文字列のみ指定されており、書式文字列が省略された

形で呼び出されている。

 

リスト)

#include <stdlib.h>

main (int argc, char* argv[]) {

         printf(argv[1]);

}

 

通常の文字列が入力される場合は問題ないが、書式文字列を含んだ入力を与えることで攻撃ができる。

printf関数では、書式文字列が指定されると、対応する変数が引数で与えられているものとして

動作するため、下図のように不正な動作となってしまう。

 

下図は単純な例であるが、不正コードを入力させ、実行させることも可能である。

 

"%n"を入力

printf(argv[1]);

戻りアドレス

引数1

 

実際のスタック領域

printf関数は、引数2があるものとして動作する。

printf("%n",<引数2>);

戻りアドレス

引数1

 

引数2

 

書換えられる!

"%n"を入力

printf(argv[1]);

戻りアドレス

引数1

 

実際のスタック領域

printf関数は、引数2があるものとして動作する。

printf("%n",<引数2>);

戻りアドレス

引数1

 

引数2

 

1)      scanf系関数を使用するときは、上限サイズを指定

scanf系の関数には、上限サイズを省略した書式が記述できてしまうため、上限サイズを指定した

書式を記述する。または、上限サイズを指定できるfgets関数に置き換える。

 

危険な例)

char buffer[256];

int num;

num = fscanf(stdin, "%s", buffer);

 

修正例①)

char buffer[256];

int num;

num = fscanf(stdin, "%255s", buffer);

 

修正例②)

char buffer[256];

fgets(buffer, 256, stdin);

 

危険な関数

scanf

sscanf

fscanf

vfscanf

vscanf

vsscanf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值