pwn初識格式化字串漏洞

2021-09-02 10:32:22 字數 1871 閱讀 3072

格式化字串漏洞通常情況下是由printf函式產生的;

正常情況下我們用printf函式輸出字串時是這樣的:

char a[100]="fmtstr";

int b=12,c=666;

printf("%s %d %x",a,b,c);

但是有時是出於方便會直接輸出字串:

char str[12]="fmtstr";

printf(str);

這時,如果這個str是我們使用者輸入可控的,那麼這就存在了乙個格式化字串漏洞,這時攻擊者將有機會對任意記憶體位址進行讀寫操作;

printf的讀寫操作:

我們都知道printf函式可以列印出一段內容,比如:

printf("%d",a); //列印乙個整型a

printf("%s",b); //列印乙個字串b

printf("%c",c); //列印乙個字元c

printf("%x",d); //以十六進製制數的格式列印d

但是printf裡面還有乙個%n的格式可以用來對一段位址寫值;

#includeint main()

輸出結果:a=3 b=6 c=123

我們並沒有對a,b,c進行初始化和賦值,但我們通過%n來寫入了乙個值,這就是printf寫的操作,具體的還可以往某乙個位元組寫值(%hnn);

危害:

用乙個簡單的列子來說明:

#includeint main()            

如果我們將我們輸入一些特殊的字串比如%x會怎麼樣呢;

我們發現,它將棧中的資料列印出來了,而我們輸入的第乙個資料在第6個;

如果我們將我們輸入是『aaaa'換成某乙個位址,然後找到它在棧中的位置,我們是不是就可以獲得一些敏感資訊了呢,

比如我們可以列印出開了canary的cookie,某乙個函式在got表中的位址然後找到函式的真實的位址,然後減去偏移獲得基位址;

具體的方法我們在另外一篇中,用乙個具體的列子來講。。。。。

# 格式引數詳解

%a             浮點數、十六進製制數字和p-記數法(c99)

%a    浮點數、十六進製制數字和p-記法(c99)

%c     乙個字元(char)

%c           乙個iso寬字元

%d    有符號十進位制整數(int)(%e    浮點數、e-記數法

%e    浮點數、e-記數法

%f     單精度浮點數(預設float)、十進位制記數法(%.nf  這裡n表示精確到小數字後n位.十進位制計數)

%g    根據數值不同自動選擇%f或%e.

%g    根據數值不同自動選擇%f或%e.

%i              有符號十進位制數(與%d相同)

%o    無符號八進位制整數

%p      指標

%s     對應字串char*(%s             對應寬字串wcahr*(%u      無符號十進位制整數(unsigned int)

%x    使用十六進製制數字0f的無符號十六進製制整數 

%x      使用十六進製制數字0f的無符號十六進製制整數

%%     列印乙個百分號

pwn 格式化字串漏洞

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

某道Pwn(格式化字串漏洞)

格式化字串漏洞近幾年出現頻率少了,但是一些 ctf 中還有涉及,就當玩玩好了。首先看這一段 什麼比賽的題我忘了 include int main void return 0 目標是拿到flag。我們使用gcc編譯之後用objdump反編譯 8048507 c7 45 8800 0000 00 mov...

格式化字串漏洞

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