char s[10]
printf(s)

这样虽然也可以输出,但是输入交给用户就会出现问题,如果输入的字符串为”%x%x%x%x”会直接出现内存中的数据,这是由于printf函数不知道参数,对于特定的%,会去取相应的参数,直到检索到字符串结束.所以尽管没有参数,上面的代码也会将字符串后面的内存当作参数,以16进制输出.任意的内存读取需要用到%s,其对应的参量是一个指向字符串首地址的指针,且局部变量(格式化字符串,即在printf中的)是存储在栈中,所以一定可以找到输入的字符串.
此时如果需要修改一些其他变量值,只需要计算参数的偏移量,找出参数位置,通过%n的使用,即可修改程序的参数