我正在上安全編碼和格式漏洞的課程。我以為我了解了 printf() 的基礎知識,但我的掌握似乎比我想象的要脆弱。
我正在努力理解:
printf ("\x10\x01\x48\x08 %x %x %x %x %s");
通常,printf其中有一個帶有格式說明符的字串和一個變數作為引數,但這里只有一個引數。在這里,printf正在從位置讀取0x90480110(因為機器是小端的)。此外,%x導致堆疊指標 (ESP) 移動 4 個位元組。所以,基本上這就像說ESP - 0x20(我假設這是一臺 32 位機器)。然后,%s從該地址讀取。我對這行代碼的評估是否正確?
不過,我對一些事情感到困惑。
當我們給出printf地址\x10\x01\x48\x08時,我很困惑為什么它從那個位置讀取。這是printf怪癖嗎?您提供一個地址,它將從該位置讀取?
格式說明符如何移動堆疊指標?我認為它們只是編譯器解釋資料型別的一種方式。
編輯:這是我的來源:https ://web.ecs.syr.edu/~wedu/Teaching/cis643/LectureNotes_New/Format_String.pdf
uj5u.com熱心網友回復:
我正在努力理解:
printf ("\x10\x01\x48\x08 %x %x %x %x %s");
這相當簡單:您告訴 printf() 輸出以四個十六進制值(其中三個是非列印值)開頭的行,然后格式化由空格分隔的五個值。但是,您沒有為這些值提供輸入,因此這是無效的代碼行。
我懷疑你想要做的是:
printf("%x %x %x %x", 0x10, 0x01, 0x48, 0x08);
但這只是一個猜測。
uj5u.com熱心網友回復:
你基本上做了你不被允許做的事情。您為 printf 函式提供了格式說明符,但沒有提供任何變數。變數的值通常被壓入堆疊,這是 printf 獲取它們的地方。
因此,如果您實際上沒有在堆疊上放置任何東西(printf 無法知道),它仍然會從堆疊中讀取以能夠列印您提供的說明符,從而導致列印隨機資料。
您提供的字串\x10\x01\x48\x08不是地址,它只是使用十六進制數字指定的四個字符。
一些編譯器將檢查您提供的說明符以及您傳遞的變數以查看它們是否匹配。雖然不是全部。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/416026.html
標籤:
上一篇:測驗PE檔案
