C++緩衝區溢位
阿新 • • 發佈:2019-02-08
gets(char* ) 根本不執行邊界檢查,它會向緩衝區連續寫入,其危險級別可以說是近乎C/C++中最高。
遇到 EOF 字元或換行字元之前,不會停止讀入文字,這還都不算什麼,這個函式最可怕的一點是會寫出堆溢位;
作為一個替代方法,可以使用方法 fgets()。它可以做與 gets() 所做的同樣的事情,但它接受用來限制讀入字元數目的大小引數,因此,提供了一種防止緩衝區溢位的方法。
一般來說在C/C++中出現棧溢位的問題比較多見(gets,strcpy等都能很容易做到),堆溢位可以說是極難極難實現,這實在是太可怕了...
示例如下:
please input some letters: abcdefghijklmnopqrstuvwxyz#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; }
Number: yz
Letter: abcdefghijklmnopqrstuvwxyz
使您的軟體執行起來: 防止緩衝區溢位
這篇文章很不錯的,轉自:
http://www.ibm.com/developerworks/cn/security/buffer-defend/