2012-03-03 72 views
3

我有簡單的C程序:格式化字符串漏洞

char user_input[100]; 
scanf("%s", user_input); 
printf(user_input); 

這是我的理解,這代表的安全漏洞;例如輸入一堆%x將打印出堆棧的內容。

但是如何打印選定的內存位置?

我讀到:

\x10\x01\x48\x08_%08x.%08x.%08x.%08x.%08x|%s| 

應在位置0x08480110從this paper傾銷存儲的內容。但是,它將打印出堆棧上格式化字符串的接下來的4個字節。我試圖理解爲什麼。

+6

這是一個樹林問題,輸入超過99個字符來調用緩衝區溢出。小鮑比表的故事不消毒輸入。 – 2012-03-03 19:11:31

回答

1

格式字符串本身將位於堆棧上(因爲您已將user_input聲明爲局部變量)。所以,如果你走得足夠遠(這就是要做的事情),那麼你最終會到達格式字符串的開頭。 %s告訴printf從堆棧中讀取地址,然後打印在該位置找到的字符串。所以它讀取格式字符串的前4/8個字節,並將其用作地址。

當然,爲了達到這個目的,您需要確切地知道要通過堆棧讀取多長時間才能點擊格式字符串。所以你可能需要調整%08x的數量。

此外,在運行時進入\x10用戶是不一樣的字符串中包含\x10你的源代碼的文字...

+0

內存中的格式字符串是否比user_input低?此外,我明白%x「走棧」,有沒有辦法打印出堆棧的全部內容,即一種方式走棧的格式字符串,將使用前4個字節作爲地址必須從堆棧中讀取,但不打印出它們之間的所有內容? – 2012-03-03 19:20:31

+0

@Pi_:這取決於。在x86上,堆棧通常會向下增長(所以'printf'的堆棧幀將位於比調用者的堆棧幀更低的地址處)。 – 2012-03-03 19:21:34

+0

注意:我發現輸入「%n $ x」(其中n是一個整數)正在經歷前n-1次迭代而不打印結果(即它彈出n-1次迭代並直接進入n的迭代) – 2012-03-03 19:58:46