addr%k$s
上這個(gè)格式為什么是這樣呢歧强?
是格式化字符為什么這樣樊破?
%k$s:s代表輸出的是字符串属百,k代表是第幾個(gè)參數(shù);
https://www.anquanke.com/post/id/180009
具體的來(lái)說(shuō),是輸出棧中存儲(chǔ)地址所指向的字符串
%n:將%n之前printf已經(jīng)打印的字符個(gè)數(shù)賦值給偏移處指針?biāo)赶虻牡刂肺恢锰е剑?100x10$n表示將0x64寫入偏移10處保存的指針?biāo)赶虻牡刂罚?字節(jié))誊辉,而%$hn表示寫入的地址空間為2字節(jié),%$hhn表示寫入的地址空間為1字節(jié)恼蓬,%$lln表示寫入的地址空間為8字節(jié)惊完,在32bit和64bit環(huán)境下一樣。有時(shí)处硬,直接寫4字節(jié)會(huì)導(dǎo)致程序崩潰或等候時(shí)間過(guò)長(zhǎng)小槐,可以通過(guò)%$hn或%$hhn來(lái)適時(shí)調(diào)整。
但是:這樣獲取的是相對(duì)于格式化字符串的第k個(gè)參數(shù)
首先荷辕,對(duì)于%k$s這一個(gè)凿跳,表示將相對(duì)于格式化字符串的第k個(gè)參數(shù)以%s形式輸出。
正常情況下疮方,一個(gè)printf函數(shù)格式為
像上面那樣控嗜,格式化字符串是第一個(gè)參數(shù),a是第二個(gè)參數(shù)骡显,疆栏。曾掂。。承边。
什么叫相對(duì)于格式化字符串第k個(gè)參數(shù)呢遭殉?
當(dāng)程序運(yùn)行時(shí)石挂,到printf函數(shù)時(shí)看一下堆棧圖:
源程序是這樣的:
而 printf("%08x.%08x.%08x.%s\n", a, b, c, s);堆棧圖是這樣的
可以看到博助,這樣就是相對(duì)于格式化字符串的第k個(gè)參數(shù)。
原話是這樣的
那么為什么要addr%k%s呢痹愚?
先插入一個(gè)小知識(shí):
對(duì)于上面的例子富岳,在進(jìn)入 printf 函數(shù)的之前 (即還沒有調(diào)用 printf),棧上的布局由高地址到低地址依次如下
我們可以看到拯腮,在沒有call printf之前棧上的地址就是這樣了窖式。