格式化字符串漏洞利用 二、格式化函數(shù)

二伊履、格式化函數(shù)

原文:Exploiting Format String Vulnerabilities

作者:scut@team-teso.net

譯者:飛龍

日期:2001.9.1

版本:v1.2

格式化函數(shù)是一類特殊的 ANSI C 函數(shù)蓖宦,接受可變數(shù)量的參數(shù)宵呛,其中的一個就是所謂的格式化字符串篙悯。當(dāng)函數(shù)求解格式化字符串時蚁阳,它會訪問向函數(shù)提供的額外參數(shù)。它是一個轉(zhuǎn)換函數(shù)鸽照,用于將原始的 C 數(shù)據(jù)類型表示為人類可讀的字符串形式螺捐。它們在幾乎任何 C 程序中都會使用,來輸出信息、打印錯誤信息或處理字符串定血。

這一章中赔癌,我們會涵蓋格式化函數(shù)使用中的典型漏洞,正確用法澜沟,它們的一些參數(shù)届榄,以及格式化字符串漏洞的一般概念。

2.1 格式化字符串

如果攻擊者能夠向 ANSI C 格式化函數(shù)提供字符串倔喂,無論部分還是全部,就出現(xiàn)了格式化字符串漏洞靖苇。由此席噩,格式化函數(shù)的行為會改變,并且攻擊者就可能控制目標(biāo)應(yīng)用贤壁。

在下面的例子中悼枢,字符串user由攻擊者提供 -- 他可以控制整個 ASCIIZ 字符串,例如通過使用命令行參數(shù)脾拆。

錯誤用法:

int func (char *user) { 
    printf (user); 
}

正確用法:

int func (char *user) { 
    printf ("%s", user); 
}

2.2 格式化函數(shù)系列

ANSI C 規(guī)范中定義了大量格式化函數(shù)馒索。有一些基本的格式化函數(shù),復(fù)雜的函數(shù)基于它們名船,它們中的一些并不是標(biāo)準(zhǔn)的一部分绰上,但是廣泛可用。

實際成員為:

  • fprintf -- 打印到FILE

  • printf -- 打印到stdout

  • sprintf -- 打印到字符串

  • snprintf -- 打印到字符串渠驼,帶有長度檢查

  • vfprintf -- 從va_arg結(jié)構(gòu)打印到FILE

  • vprintf -- 從va_arg結(jié)構(gòu)打印到stdout

  • vsprintf -- 從va_arg結(jié)構(gòu)打印到字符串

  • vsnprintf -- 從va_arg結(jié)構(gòu)打印到字符串蜈块,帶有長度檢查

近親:

  • setproctitle -- 設(shè)置argv[]

  • syslog -- 輸出到syslog設(shè)施

  • 其它類似err*, verr*, warn*, vwarn*的函數(shù)

2.3 格式化函數(shù)的用法

為了理解這個漏洞在 C 語言代碼的哪里,我們必須檢驗格式化函數(shù)的目的迷扇。

功能

  • 用于將簡單的 C 數(shù)據(jù)類型轉(zhuǎn)換為字符串表示

  • 允許指定表示的格式

  • 處理產(chǎn)生的字符串(輸出到stderr百揭、stdoutsyslog...)

格式化函數(shù)工作原理

  • 格式化字符串控制了函數(shù)的行為

  • 它指定了需要打印的參數(shù)類型

  • 直接(傳值)或間接(傳址)保存二者

調(diào)用函數(shù)

需要知道它向棧中壓入了多少參數(shù)蜓席,因為它當(dāng)格式化函數(shù)返回時需要清棧器一。

2.4 格式化字符串具體是什么?

格式化字符串是一個 ASCIIZ 字符串厨内,包含文本和格式化參數(shù)祈秕。

例如:

printf ("The magic number is: %d\n", 1911); 

要打印的文本是The magic number is:,后面是格式化參數(shù)%d隘庄,它在輸出中會被參數(shù)1911代替踢步。所以輸出是這個樣子:he magic number is: 1911

一些格式化參數(shù):

參數(shù) 輸出 傳遞方式
%d 十進制(int 傳值
%u 無符號十進制(unsigned int 傳值
%x 十六進制(unsigned int 傳值
%s 字符串((const) char* 傳址
%n 目前為止寫入的字節(jié)數(shù)(int * 傳址

\字符用于轉(zhuǎn)義特殊字符丑掺。它會被 C 編譯器在編譯使其替換获印,將轉(zhuǎn)義序列替換為二進制中的適當(dāng)字符。格式化函數(shù)并不會識別這些特殊的序列。實際上兼丰,它們并不對格式化字符串做任何事情玻孟,但是有時會產(chǎn)生混淆,就像它們被編譯器求值一樣鳍征。

例如:

printf ("The magic number is: \x25d\n", 23);

上面的代碼可以工作黍翎,因為\x25在編譯時期替換為%,雖然0x25(37)是百分號字符的 ASCII 值艳丛。

2.5 棧和它在格式化字符串中的作用

格式化函數(shù)的行為由格式化字符串控制匣掸。函數(shù)接受棧上的一些參數(shù),它們由格式化字符串請求氮双。

printf ("Number %d has no address, number %d has: %08x\n", i, a, &a);

printf來看碰酝,棧的樣子是:

   棧頂
+--------+
|  ...   |
|   &a   |
|   a    |
|   i    |
|   A    |
|  ...   |
+--------+
   棧底

其中:

符號 含義
A 格式化字符串的地址
i 變量i的值
a 變量a的值
&a 變量a的地址

格式化字符串現(xiàn)在解析了格式化字符串A,一次讀取一個字符戴差。如果它不是%送爸,字符會復(fù)制到輸出中。否則暖释,%后面的字符規(guī)定了要求值的參數(shù)類型袭厂。字符串%%擁有特殊函數(shù),用于打印轉(zhuǎn)義字符%本身球匕。其它每個參數(shù)都和數(shù)據(jù)相關(guān)纹磺,位于棧上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谐丢,一起剝皮案震驚了整個濱河市爽航,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乾忱,老刑警劉巖讥珍,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窄瘟,居然都是意外死亡衷佃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門蹄葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氏义,“玉大人,你說我怎么就攤上這事图云」哂疲” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵竣况,是天一觀的道長克婶。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么情萤? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任鸭蛙,我火速辦了婚禮,結(jié)果婚禮上筋岛,老公的妹妹穿的比我還像新娘娶视。我一直安慰自己,他們只是感情好睁宰,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布肪获。 她就那樣靜靜地躺著,像睡著了一般柒傻。 火紅的嫁衣襯著肌膚如雪贪磺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天诅愚,我揣著相機與錄音,去河邊找鬼劫映。 笑死违孝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泳赋。 我是一名探鬼主播雌桑,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祖今!你這毒婦竟也來了校坑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤千诬,失蹤者是張志新(化名)和其女友劉穎耍目,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐绑,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡邪驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了傲茄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅访。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盘榨,靈堂內(nèi)的尸體忽然破棺而出喻粹,到底是詐尸還是另有隱情,我是刑警寧澤草巡,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布守呜,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弛饭。R本人自食惡果不足惜冕末,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蒋譬、第九天 我趴在偏房一處隱蔽的房頂上張望捂蕴。 院中可真熱鬧负敏,春花似錦饺律、人聲如沸鸵膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽间学。三九已至拒担,卻和暖如春嘹屯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背从撼。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工州弟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人低零。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓婆翔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掏婶。 傳聞我的和親對象是個殘疾皇子啃奴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容