格式化漏洞主要利用以下几种形式:
image
image
image
总结:
栈上存有123数据,%d,%u,%x,%p就是打印栈上的内容,也就是123,而%s就是打印栈内容上123对应的地址,其对应的地址上所保留的数据
image
例如(32位程序):
0x111 -> a 0xa->233
0x112 -> b 0x???->???
0x113 -> c 0x???->???

前四个就是打印栈上内容a,b,c %s就是打印233

格式化字符串漏洞关键:找到字符串偏移量
调用printf函数的过程:
mov eax,数组首地址
push eax
call printf
栈情况:
image

题目分析:
看保护知道栈溢出是八行的啦

反汇编后很明显是格式化字符串漏洞,printf(&s)这种写法非常致命的,此题需要让全局变量pwnme变成8才可以
image

首先找偏移量:AAAA对应0x41414141,偏移量为10
image
因为没有开启PIE保护,全局变量的地址是不变的,查看是0x804A068
image

EXP:
image
当时困惑为什么payload要加上全局变量地址,后面理解了上图原理后,原来printf函数调用的时候会把数组的首地址压栈,因此写入的字符串前面得是四个字节的有效地址,否则会报错如下:
image
要想改变pwnme全局变量就得先找到pwnme所属的空间的首地址,通过printf固定的偏移量和格式化漏洞来修改pwnme的值