格式化字串 部分

2021-10-16 16:54:50 字數 1641 閱讀 2856

格式化字串就是使用format函式將指定字串轉換為想要輸出的格式

①常見的有格式化字串函式有 輸出

函式基本介紹

printf

輸出到stdout

printf

輸出到 stdout

fprintf

輸出到指定 file 流

vprintf

根據引數列**式化輸出到 stdout

vfprintf

根據引數列**式化輸出到指定 file 流

sprintf

輸出到字串

snprintf

輸出指定位元組數到字串

vsprintf

根據引數列**式化輸出到字串

vsnprintf

根據引數列**式化輸出指定位元組到字串

setproctitle

設定 ar**

syslog

輸出日誌

err, verr, warn, vwarn 等

。。。①常見的格式化字串

字串型別表示d

4-byte整數u

4-byte

無符號整數

x4-byte

十六進製制數

s4-byte ptr

字串c 1-byte

單個字元

hh1-byte

限定輸出格式為8位

h2byte

限定輸出格式為16位

i4byte

限定輸出格式為32位

ii8-byte

限定輸出格式為64位

②常見格式化字串格式(摘自ctf wiki)

%[parameter][flags][field width][.precision][length]type

flags(可為0個或多個)

field width

precision

length,輸出的長度

type

錯誤的使用,直接將使用者的輸入作為了fmt使用

例如,以printf為例:

我們正常使用printf時,是這樣的:printf("%s", str,n)

但是由於一些人馬虎或者偷懶,可能會寫成printf(str),這種情況下,程式雖然會報錯,但是依舊是編譯成功的。但是,此時str會被當做是乙個format引數。眾所周知,format引數中的字串是可以被輸出的,但是如果這串字串中有基本的格式化字串引數(如%s, %n, %x, %p等),那麼這些內容就會被當做基本的格式化字串引數來處理,這樣就出現了可利用的漏洞。

2.常用格式化字串引數

引數基本介紹

%c輸出字元

%d輸出十進位制整數

%x輸出16進製制資料

%p輸出16進製制資料(與%x基本相同,只是附加字首0x)

%s輸出字串(偏移處指標指向的字串)

%n將%n之前printf已經列印的字元個數賦值給偏移處指標所指向的位址位置

由於存在格式化字串漏洞,所以,格式化字串可以被攻擊者的輸入任意控制,但是printf本身是檢查後面有幾個引數。所以,我們可以利用%x來造成棧上資訊洩露,利用$來控制資訊洩露的位置,從而達到對任意位址資料的控制。

①got劫持

字串格式化

sprintf snprintf snprintf std stringstream std strstream boost lexical cast boost format cstring format 1 sprintf 使用 sprintf 不安全,輕則破壞資料的準確性,重則程式崩潰。請看下...

格式化字串

通常在使用字串的時候,會對字串進行格式化,然後輸出或呼叫 一般我們使用替換標記對字串進行格式化 string str1 string.format add is 1,2,3 而且在c 中的替換標記可以以任意順序和次數出現在格式化字串中,但替換值是按順序排的,而且替換標記不能超出索引範圍 string...

字串格式化

例如 string s hello map.put target world string res format s,map 有什麼用呢?比如在some.properties中配置模板字串,但是如果用 這種方式,在配置了spring讀取properties注入變數的時候,這個變數就找不到會報錯。這個...