格式化字串漏洞通常情況下是由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...