0
#include <stdio.h>
#include <string.h>

#define SRC_BUFF_SIZE 32
#define DST_BUFF_SIZE 8

int tempfn1(char *p)
{
    printf("p %p\n", p);
    return 0;
}

int tempfn(char *ip, int size)
{
    char pttt[DST_BUFF_SIZE];
    printf("ip %p\n", ip);
    tempfn1(ip);
    // ERROR - copying more data to a local buffer of 4 bytes

    //memcpy(pttt, ip, size); // This will lead to stack corruption as     
                              // the size exceeds the size of destination

    // IDEALLY the copy should be done with min of size of destination buffer 
    // or source size rather than source size... 
    // anyways dest can hold only the size so it is better to crop the buffer 
    // than to crash due to overflow. 
    // proper call is as follows
    #define MIN(a,b) (((a) < (b)) ? (a) : (b))
    memcpy(pttt, ip, MIN(size, DST_BUFF_SIZE));

    printf("ip %p\n", ip);
    tempfn1(ip);
    return 0;
}

int main()
{
    char ip[SRC_BUFF_SIZE] = {0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2 };
    tempfn(ip, SRC_BUFF_SIZE);
    return 0;
}

これは、スタックの破損を回避するためのサンプル プログラムです。スタックの破損を回避するために、宛先の長さとソースの長さをチェックする他の機能はありますか?

4

2 に答える 2

4

あなたの質問は文字通りに要約すると-

ポインタを指定して、それが指しているメモリ ブロックのサイズを見つけます

これは不可能であり、意味もありません。したがって、この難しい質問を簡単にするために、ポインターがcharポインターであり、インジケーター\0として扱われるなど、いくつかの仮定を行う必要があります。次に、などEnd-Of-Blockの機能を使用できますstrlen

しかし、あなたの与えられたケースでは、これはどれもうまくいきません.あなたがしていること( を使用してMIN)は問題ないように見え、あなたが望むものに近づくことができます.

于 2012-08-08T09:48:40.493 に答える
3

あなたが指している概念は、スタックの破損だけに適用されるわけではありません。一般に、メモリ オーバーフローを回避するために適用されます。メモリ オーバーフローは、スタック変数と一緒に使用するとスタックの破損につながる可能性があり、ヒープ変数と一緒に使用するとヒープが破損する可能性があります。基本的に、未定義の動作につながります。

これを回避する最善の方法は次のとおりです。

  1. Kerrek SB がコメントで正しく指摘しているように、正しく (つまり、適切なロジックで) プログラミングすること。
  2. strcpy の代わりに strncpy、strcat の代わりに strncat などの関数を使用すると、ここで適用しようとしたのと同じ安全性の概念を適用するのに役立ちます。

Secure Coding Guidelines and Practices に関する次の 2 つのリンクが役立つ場合があります。

http://www.atsec.com/downloads/pdf/secure-coding-guidelines.pdf
https://www.securecoding.cert.org/confluence/display/seccode/Top+10+Secure+Coding+Practices

于 2012-08-08T09:57:48.257 に答える