格式化字串漏洞歸納

2021-10-10 11:56:03 字數 1356 閱讀 2524

主要是構建框架,沒有詳細闡述內容

分為兩部分,漏洞原理與利用方式

通常來說,利用格式化字串漏洞使得程式崩潰是最為簡單的利用方式,因為我們只需要輸入若干個%s即可。這是因為棧上不可能每個值都對應了合法的位址,所以總是會有某個位址可以使得程式崩潰。這一利用,雖然攻擊者本身似乎並不能控制程式,但是這樣卻可以造成程式不可用。比如說,如果遠端服務有乙個格式化字串漏洞,那麼我們就可以攻擊其可用性,使服務崩潰,進而使得使用者不能夠訪問。

利用格式化字串漏洞,我們還可以獲取我們所想要輸出的內容。一般會有如下幾種操作:

洩露棧記憶體

1、獲取某個變數的值

2、獲取某個變數對應位址的記憶體

洩露任意位址記憶體

1、利用got表得到libc函式位址,進而獲取libc,進而獲取其它libc函式位址

ctfwiki關於洩露任意位址記憶體

配個圖

2、盲打,dump整個程式,獲取有用資訊。

覆寫棧記憶體

這裡面關鍵是確定偏移

有兩種方法,第一種就是輸入%p-%p這種東西去試,第二種試除錯,洩露棧變數數量,這種方式。

wiki上有很多除錯

覆寫任意位址記憶體

寫入內容的時候有需要考慮寫入的是大數字還是小數字。

不同的數字需要不同的寫入技巧。

小數字aa%8$naa + addr

大數字在目前的 c 程式中,libc 中的函式都是通過 got 表來跳轉的。此外,在沒有開啟 relro 保護的前提下,每個 libc 的函式對應的 got 表項是可以被修改的。因此,我們可以修改某個 libc 函式的 got 表內容為另乙個 libc 函式的位址來實現對程式的控制。比如說我們可以修改 printf 的 got 表項內容為 system 函式的位址。從而,程式在執行 printf 的時候實際執行的是 system 函式。

一般需要兩個函式實現修改got表內的內容,第乙個write函式,第二個就是格式化字串函式

很容易理解,我們要利用格式化字串漏洞來劫持程式的返回位址到我們想要執行的位址。

盲打1盲打2

1 棧上的格式化字串漏洞

棧上指的是輸入的格式化字串存在了棧內。

2 非棧上的格式化字串漏洞

非棧上指的是堆上跟bss段上,原理不難,難在利用姿勢上,簡述一下,需要先洩露一些必須的位址,再通過棧內的位址鏈,一般是棧幀位址鏈,三個以上,然後通過第乙個控制第二個位址大小將第三個位址乙個位元組乙個位元組寫成攻擊位址,然後通過第二第三個位址將攻擊位址裡面達到乙個任意寫,中間需要第二個位址是因為要控制乙個位元組乙個位元組去寫,就是格式化字串漏洞任意記憶體寫的大數處理方法。

非棧上的格式化字串利用

格式化字串漏洞

在編寫程式時由於編寫的不規範有可能產生這個漏洞。下面乙個例子 includeint a 2 int main 編譯時使用 gcc test.c m32表示編譯成32位的程式上面這個例子便是乙個很簡單的格式化字串漏洞,產生格式化字串漏洞需要兩個條件 下面講解printf輸出的原理 eg name su...

格式化字串漏洞簡介

格式化字串,也是一種比較常見的漏洞型別。會觸發該漏洞的函式很有限。主要就是printf還有sprintf,fprintf等等c庫中print家族的函式。我們先來看看printf的函式宣告 int printf const char format,這個是每個學過c語言的人一定會知道 會使用的函式。先是...

pwn 格式化字串漏洞

原理 因為沒有正確使用printf 函式 正確使用 printf s str 不正規使用 printf str 控制字串str可以爆出stack內內容從而實現任意位址讀或者任意位址寫 入門題01 18行存在格式化字串漏洞 只需輸入在hello之後輸入password所在位址,接收password值再...