1
-(void)InitWithPwd:(char *)pPwd
{

    char szResult[17];


    //generate md5 checksum
    CC_MD5(pPwd, strlen(pPwd),&szResult[0]);
    szResult[16] = 0;

    m_csPasswordHash[0]=0;


    for(int i = 0;i < 16;i++) 
    {

        char sz[3] = {'\0'};
        //crash in blow row. The first pass is ok. The third pass crash. 
        //I can't understand.
        sprintf(&sz[0],"%2.2x",szResult[i]);
        strcat(m_csPasswordHash,sz);
    }

    m_csPasswordHash[32] = 0;
    printf("pass:%s\n",m_csPasswordHash);
    m_ucPacketType = 1;

}

パスワードのmd5を取得したい。しかし、上記のコードは何度もクラッシュします。理由がわかりません。

4

1 に答える 1

4

バッファ ( sz) が小さすぎるため、sprintf()未定義の動作につながるバッファ オーバーフローが発生し、この場合はクラッシュします。

szResult[1]をとして表示すると負の値になる可能性があることに注意してください(これは に-type 値をint渡すときに発生します)。これにより、完全な値をフォーマットするためにフィールド幅と精度のディレクティブが無視される可能性があります。charsprintf()sprintf()

この問題を示す例を次に示します。サンプルコードは C で書かれていますが、この場合は問題になりません。

これは、受信データが署名されていないと見なされるようにすることで問題を解決します。

sprintf(sz, "%02x", (unsigned char) szResult[i]);
于 2013-02-06T10:46:03.673 に答える