C 使用短写操作格式化字符串漏洞:关闭4个字节

C 使用短写操作格式化字符串漏洞:关闭4个字节,c,linux,exploit,C,Linux,Exploit,在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后得到4980

在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

如果任何人都有可能遇到相同的问题,那么64874的值就是计算得出的地址前两个字节的值。所以它是0xfd72-8=64874。他减去8,因为通过printf命令写入的地址有四个字节。当我试图通过printf只打印四个字节来运行相同的东西时,它会被关闭四个字节,因为写入的字节少了四个

偏移量可能是函数的“堆栈帧”的大小,或者大约。@JonathanLeffler,我如何检查是否是这种情况?这本书没有解释吗?应该是的。哦,我知道原因了。64874是我想要的地址的前两个字节减去我用printf写入的地址的8个字节的值。如果我只打印地址的4个字节,那么当我使用相同的64874时,我将关闭4个字节。不,这本书没有解释它。