addr%k$s
上这个格式为什么是这样呢?
是格式化字符为什么这样?
%k$s:s代表输出的是字符串,k代表是第几个参数;
https://www.anquanke.com/post/id/180009
具体的来说,是输出栈中存储地址所指向的字符串
%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100x10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。
但是:这样获取的是相对于格式化字符串的第k个参数
首先,对于%k$s这一个,表示将相对于格式化字符串的第k个参数以%s形式输出。
正常情况下,一个printf函数格式为
像上面那样,格式化字符串是第一个参数,a是第二个参数,。。。。
什么叫相对于格式化字符串第k个参数呢?
当程序运行时,到printf函数时看一下堆栈图:
源程序是这样的:
而 printf("%08x.%08x.%08x.%s\n", a, b, c, s);堆栈图是这样的
可以看到,这样就是相对于格式化字符串的第k个参数。
原话是这样的
那么为什么要addr%k%s呢?
先插入一个小知识:
对于上面的例子,在进入 printf 函数的之前 (即还没有调用 printf),栈上的布局由高地址到低地址依次如下
我们可以看到,在没有call printf之前栈上的地址就是这样了。














网友评论