gets函式的漏洞
gets函式和fgets函式最大的不同是gets函式的緩衝區雖然由使用者提供,但是使用者無法指定其一次最多讀入多少位元組的內容。這一點導致gets變成了一個非常危險的函式。
下例演示了gets函式的危險性。該程式定義了一個緩衝區,但是使用gets函式接收使用者輸入的字串時卻會出現問題。
(1)在vi編輯器中編輯該程式如下:
程式清單21-5 risk.c 利用gets函式的漏洞進行緩衝區攻擊
#include <stdio.h> int main(void) { /* 這個緩衝區已經很大了,如果使用者輸入是在命令列方式下的話,該緩衝的空間是足夠的 */ char buf[2048]; while(gets(buf) != buf){ /* 從螢幕讀入一行字串 */ printf("%s\n", buf); /* 並且將該字串顯示輸出到螢幕上 */ } return 0; } |
$gcc risk.c -o risk |
$./risk hello world (輸入) hello world (輸出) welcome to the real world, it sucks, but you will love it(輸入) welcome to the real world, it sucks, but you will love it(輸出) |
到目前為止都沒有出現問題,事實上,在命令列終端的情況下不會出現問題。因為shell終端的輸入緩衝區只有1024個位元組,也就是說我們的攻擊實際上被shell擋住了。
(4)這個時候換一種方式,先結束該程式。
$^c |
$./risk < big_file.txt Segmentation fault |
段錯誤出現了,程式崩潰了。原因就是輸入的字元過多,造成了gets函式的緩衝區越界。
注意:由此可見,gets函式確實是一個非常不安全的函式,所以筆者不推薦讀者使用該函式。
相關文章
- 緩衝區溢位漏洞那些事:C -gets函式函式
- gets函式的不安性詳解函式
- C語言關於指標,gets()和gets_s()函式的理解C語言指標函式
- PHP函式漏洞審計之addslashes函式-PHP函式
- oracle buffer gets=db block gets+consistent getsOracleBloC
- highlight_file函式漏洞函式
- Python2 input函式漏洞利用Python函式
- C語言——常用標準輸入輸出函式 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字串拷貝函式 strcpy(), strncpy(), strchr(), strstr()函式用法特點C語言函式字串
- recursive calls ,db block gets , consistent gets的含義BloC
- 為什麼C語言的strcpy函式有漏洞(轉)C語言函式
- consistent gets、db block gets的簡單精闢的理解BloC
- DB Bocks gets & Consistent gets 區別
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解BloC
- db block gets 與 consistent read getsBloC
- DB Block Gets、Consistent Gets、Physical ReadsBloC
- main函式的入口函式AI函式
- Consistent Gets,Physical Reads和DB Block Gets的解釋(轉)BloC
- (轉)關於 db block gets,consistent gets,physical reads的概念BloC
- consistent gets
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- C/C++輸入函式 scanf() gets() getline() cin.getline() cin.get() getchar()C++函式
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解和解釋BloC
- recursive calls, db block gets,consistent gets,physical ReadsBloC
- DB Bocks gets,Consistent gets And Physical reads 轉載
- 使用bind()函式的產生的函式用作建構函式this的指向函式
- 函式定義、函式的引數、函式的預設引數函式
- 箭頭函式、簡寫函式、普通函式的區別函式
- 函式宣告和函式表示式的區別函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- 閉包函式(匿名函式)的理解函式
- 函式: 函式是怎麼使用的?函式
- Rust中的into函式和from函式Rust函式
- closest()函式parent()函式的區別函式
- ascii函式和substr函式的用法ASCII函式
- 函式式 Java 到函式式 Kotlin 的轉換函式JavaKotlin
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 【函式式 Swift】函式式思想函式Swift
- db block gets的解釋[轉]BloC