C++緩衝區溢出

gets(char* ) 根本不執行邊界檢查,它會向緩衝區連續寫入,其危險級別可以說是近乎C/C++中最高。

遇到 EOF 字符或換行字符之前,不會停止讀入文本,這還都不算什麼,這個函數最可怕的一點是會寫出堆溢出;

作爲一個替代方法,可以使用方法 fgets()。它可以做與 gets() 所做的同樣的事情,但它接受用來限制讀入字符數目的大小參數,因此,提供了一種防止緩衝區溢出的方法。

一般來說在C/C++中出現棧溢出的問題比較多見(gets,strcpy等都能很容易做到),堆溢出可以說是極難極難實現,這實在是太可怕了... 

示例如下:

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void AllocHeap(void** p, int bytecount)
{
    *p = malloc(bytecount);
}

int main()
{
    char *number;
    char *letter;
    AllocHeap((void**)&letter, 10);
    AllocHeap((void**)&number, 10);
    strcpy(number, "12345678");
    printf("please input some letters: ");
    gets(letter);
    printf("Number: %s\n", number);
    printf("Letter: %s\n", letter);
    return 0;
}
please input some letters: abcdefghijklmnopqrstuvwxyz
Number: yz
Letter: abcdefghijklmnopqrstuvwxyz 


使您的軟件運行起來: 防止緩衝區溢出
這篇文章很不錯的,轉自:

http://www.ibm.com/developerworks/cn/security/buffer-defend/ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章